红鱼儿

Delphi App集成DPush

前言

前文,我们介绍了在kbmMW服务端集成DPush,实现kbmMWServer向DPush代理服务器发送消息,由于DPush优美的封装,代码量已经非常少了,实现起来非常方便与简洁。这个实现后,我们就可以在App客户端调用kbmMWServer封装的方法,轻松实现App推送消息给其他的用户。现在来看一下具体调用的代码:

procedure TTestForm.Button4Click(Sender: TObject);
var
 s:string;
begin
  s:=kbmMWSimpleClient.Request('MyQueryService','1.0','SendPush',['用户的ID','消息的标题','消息的摘要!','{“Data”:"消息的内容"}']);
  ShowMessage(s);
end;

如果你熟悉kbmMW,那很容易就看懂上面代码,就是用SimpleClient实现客户端调用服务端的SendPush方法。

好了,我们已经知道在App中发送消息,现在我们来看如何集成DPush,实现App离线接收消息。

第一步,我们要在项目中发布各个厂商推送消息SDK的中客户端Jar。

如下图:

 

 在项目管理器中,增加上面6个Jar.

第二步:发布hmsrootcas.bks文件

 

这两步的文件,都在 XXX:\DPush\Client\res目录下。

第三步,去各个厂家的开发平台去申请推送

这一步是最麻烦的,要有心理准备,各个厂家的申请过程中需要的资料是不一样的,申请好以后呢,就可以做下一步了。

我准备用单独的文章来介绍这复杂的申请过程以及申请过程中的注意事项。

第四步,修改AndroidManifest.template.xml

这一步比较麻烦,改的地方很多,不过,DPush Client Demo中已经给我们做好了例子,直接复制过来,然后按从各厂商申到的推送的参数来配置。

首先增加需要的权限:

    <!-- 以下是通用需要的权限要求 -->
    <!-- 开机启动事件 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <!-- SD卡写权限  -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--检测网络状态 | Detecting Network status-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--检测wifi状态 | Detecting WiFi status-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 允许访问振动设备 -->
    <uses-permission android:name="android.permission.VIBRATE" />
    <!--获取用户手机的IMEI,用来唯一的标识设备。 | Gets the IMEI of the user's phone, used to uniquely identify the device.-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

然后,配置厂家的参数:

1. 分别替换以下对应的通配符(包名必须替换,如果其他没有账号,可以对应测试(比如测试华为,申请好华发推送之后,只替换{华为AppID}即可):

{包名}

{华为AppID}

{小米AppID}
{小米AppKey}

{OppoAppID}
{OppoAppKey}
{OppoAppSecret}

{VivoAppID}
{VivoAppKey}

第五步,用代码来联接DPush代理服务器

uses 
  Leo.Enum.Helper,
  Leo.FMX.Log,
  Leo.PushService.Consts,
  Leo.PushService.DPush,
...
private
  FPushService: TLeoDPushService;

...
//以下代码从ClientDemo中复制的:
const
  AppName = 'xxxxx';
  AppKey  = 'xxxxx';
  ServerUrl = 'dpush.yseas.com/mydemo';

procedure TMainFrm_DPush.InitPushService;
begin
  if FPushService = nil then
  begin
    FPushService := TLeoDPushService.Create(ServerUrl, AppName, AppKey);
    FPushService.OnPushError := DoPushError;
    FPushService.OnLogEvent  := OnPushLog;
    FPushService.OnGetPushDataEvent := DoObservePushNotfiy;
    FPushService.OnSuccRegistDevice := DoSuccRegistDevice;
    FPushService.Connect();
    // Connect后正常应该会收到获取到业务Token的回调DoGetToken(可以通过OnLogEvent观察),表示业务推送库已经连接成功,如果没有需要检查 log日志
    // 搜6003错误,表示华为的Sdk,后台是是否配置了指纹,请参见华为推送申请说明
  end;
end;

ServerUrl,AppName,AppKey:这三个值跟服务端用到的是相同的,都是在申请DPush服务时得到的。用这三个参数,就可以建立一个TLeoDPushService实例,上面的代码中是FPushService。

TLeoDPushService实现了四个事件:

OnPushError:执行Connect方法时出现错误触发

OnLogEvent:接收推送的日志,用这个事件,可以跟踪TLeoDPushService执行过程情况

OnGetPushDataEvent:App收到消息,用户在点击时启动App并触发,在这个事件中,我们可以根据收到的消息处理自己的业务逻辑。

OnSuccRegisDevice:执行Connect成功时触发。

当我们使用Connect方法联接了DPush代理服务器之后,接下来,我们还需要在代理服务器上注册我们的手机设备。直接转贴Client Demo代码:

procedure TMainFrm_DPush.btnAfterLoginClick(Sender: TObject);
var
  vInitInfo: TLeoDPushInitInfo;
begin
  // App 包名 ,指服务端配置的软件标识
  vInitInfo.ClientAppName     := 'com.kinglandsoft.zhlm';
  // 业务系统的账号,与后台添加推送信息时的账号对应
  vInitInfo.ClientAppAccount  := Trim(edtBizAccount.Text);
  // Start之后,会让D推在app服务中使用对应的推送,所以这个方法一般是在业务登录(或者切换账号)后调用
  FPushService.RegistDevice(vInitInfo);
end;

万事大吉,假设第三、四步正确完成,那么编译程序到手机上并运行,就可以收到离线消息了!

现在,这里还有一种需求需要在客户端实现:按上面的实现,当你的用户在手机App上登录后,可以接收离线消息了,但是当用户退出登录时,是不希望再收到离线消息的。那怎么办呢?

TLeoDPushService为我们提供了RemoveRegist方法,实现从DPush代理服务器退出,从而满足上面的需求,不再收取离线消息。当然了,如果你在用户推出app,但还是需要他在那台手机上收到离线消息,那就不用执行这个方法,何去何从,取决于你的用户需求。

这个RemoveRegist方法,调用时需要注意:必须在成功调用RegistDevice之后才能调用,如果调用成功,会触发OnSuccRemoveRegistedDevice事件。

最后

如果你也想使用DPush实现自己的App离线推送,请加入官方QQ群513637288,以了解更多情况。

 

posted on 2021-05-16 12:54  红鱼儿  阅读(701)  评论(0编辑  收藏  举报