kbmmw 中实现客户端自动更新

Posted xalion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kbmmw 中实现客户端自动更新相关的知识,希望对你有一定的参考价值。

我们过去做过了很多客户端,客户端随时需要更新,以保证与服务器端的功能一致,目前Delphi中有很多实现客端端更新的控件,

好多同学也有自己实现客户端自动更新的功能代码,最新的kbmmw 中使用文件服务实现了客户端自动更新,一事不烦二主,今天就

使用kbmmw 自身的功能实现客户端自动更新。

首先我们需要做一个kbmmw 文件服务。这个很简单

技术图片

 

 生成一个kbmwm service 服务

unit Unit2;

// =========================================================================
// kbmMW - An advanced and extendable middleware framework.
// by Components4Developers (http://www.components4developers.com)
//
// Service generated by kbmMW service wizard.
//

interface

uses
  SysUtils,
  Classes,
  Forms,
  kbmMWSecurity,
  kbmMWServer,
  kbmMWServiceUtils,
  kbmMWFileService,
  kbmMWRTTI,
  kbmMWSmartServiceUtils;

type
  [kbmMW_Service(name:KBMMW_UPDATE, flags:[], rootPath:".\\updates", blockSize:1048576)]
  TkbmMWFileService1 = class(TkbmMWFileService)
  private
     { Private declarations }
  protected
     { Private declarations }
  public
     { Public declarations }
{$IFNDEF CPP}class{$ENDIF} function GetPrefServiceName:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetVersion:string; override;
{$IFNDEF CPP}class{$ENDIF} function GetExtendable:boolean; override;
{$IFNDEF CPP}class{$ENDIF} function GetFlags:TkbmMWServiceFlags; override;
  end;

implementation

uses Unit1;

{$R *.DFM}


// Service definitions.
//---------------------

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetPrefServiceName:string;
begin
     Result:=KBMMW_UPDATE;
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetVersion:string;
begin
     Result:=kbmMW_1.0;
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetExtendable:boolean;
begin
     Result:=false;
end;

{$IFNDEF CPP}class{$ENDIF} function TkbmMWFileService1.GetFlags:TkbmMWServiceFlags;
begin
     Result:=[mwsfListed];
end;

initialization
   TkbmMWRTTI.EnableRTTI(TkbmMWFileService1);

end.

注意服务的 名字,必须是 ‘KBMMW_UPDATE‘,你也可以修改,但是需要客户端保持一致。

加上对应的kbmmwserver 和kbmMWTCPIPIndyServerTransport1 就可以了。

在创建窗体代码的时候,别忘了使用自动注册服务

procedure TForm1.FormCreate(Sender: TObject);
begin
     kbmMWServer1.AutoRegisterServices;
end;

 

服务器端好了,我们运行起来就ok.

新建一个工程作为客户端。

放置对应的控件

技术图片

 

 注意红箭头的属性。

技术图片

 

 设置客户端的文件版本属性。

注意这个版本的为2.0.0.5. 编译后生成对应的exe 文件。

敲黑板,注意下面的操作。

在服务器端的 执行文件 目录建立一个目录 updates,然后再建立一个目录DEMO,再建立一个目录release_002_000_000_005,把上面生成的客户端exe文件放入这个目录。

技术图片

 

 同时再建立一个manifest.json 文件。

内容为

{
  "description": "Project1 v2.0.0.5",
  "files": {
  "src": "release_002_000_000_005\\Project1.exe",
  "dst": "[!--app--!]\\Project1.exe",
  "restart": true
  }
}

 

我们重新打开客户端,修改标签并加入对应的代码。

技术图片

 

 

 

procedure TForm1.CheckForUpdate;
var
   bUpdate,bUpdateRequired:boolean;
begin
    // Check if updates are available
     bUpdate:=kbmMWUpdateClient1.IsUpdatesAvailable(true);
     if bUpdate then
        bUpdateRequired:=kbmMWUpdateClient1.IsRequiredUpdatesAvailable(false);

     if bUpdate then
     begin
          if bUpdateRequired then
             ShowMessage(A required update is available. It will auto update when you close this message.)
          else if MessageDlg(An optional, but recommended, update is available. Do you want to update?,
                             mtConfirmation,[mbYes, mbNo],0,mbYes)<>mrYes then
               exit;

         kbmMWUpdateClient1.Update;
     end;


end;

procedure TForm1.FormCreate(Sender: TObject);
begin

     ver.Caption :=当前版本:+  kbmMWUpdateClient1.CurrentVersion;

end;

 

修改文件的版本信息。

技术图片

 

 

 

 

 编译并运行。

点击检查更新

技术图片

 

 本更新为可选更新,可以选择是否更新。

 选择yes 后,就会自动更新本程序

技术图片

 

那么我们也可以使用强制更新。

我们只需要把服务器端的目录名加一个R,就表示强制更新。

技术图片

 

{
  "description": "Project1 v2.0.0.5",
  "files": {
  "src": "release_002_000_000_005R\\Project1.exe",
  "dst": "[!--app--!]\\Project1.exe",
  "restart": true
  }
}

 

 运行客户端程序

技术图片

 

 

 点击ok

技术图片

 

 正常更新。

 

以上是关于kbmmw 中实现客户端自动更新的主要内容,如果未能解决你的问题,请参考以下文章

在片段中实现 onClickListener

kbmmw 中虚拟文件操作入门

REST easy with kbmMW #20 – OpenAPI and Swagger UI

一窥kbmmw中的 smart service

在片段中实现对话框时,必须在添加内容之前请求窗口功能

在多个片段中的片段中实现选项卡