ZEGO即时通讯(ZIM)支持离线推送消息的功能。例如在“单聊”或“群组聊天”时,如果您的程序在后台被冻结、或被系统或用户杀掉,与ZEGO服务后台的长连接超时断开后,此时如果您已接入“离线推送”功能,ZEGO后台会为目标用户发送离线推送的消息。
开发者可以通过集成ZPNsSDK,与ZIMSDK搭配使用,实现离线推送功能。
ZIM实现离线推送的方案如下:
在实现“离线推送”功能之前,请确保:
目前支持华为、小米、OPPO、vivo和Google的推送。
2.1导入ZPNsSDK
方式一:使用MavenCentral自动集成SDK(2.2.0及之后的版本才可使用)
1.进入项目根目录,打开“build.gradle”文件,在“allprojects”中加入如下代码。
...allprojects{repositories{mavenCentral()google()jcenter()}}2.进入“app”目录,打开“build.gradle”文件,在“dependencies”中添加implementation'im.zego:zpns:x.y.z'。“x.y.z”为SDK的版本号。
...dependencies{...//x.y.z请填写具体版本号,如:2.2.0//可通过SDK发布历史取得最新版本号implementation'im.zego:zpns:x.y.z'}方式二:复制SDK文件手动集成
implementationfiles('libs/zpns-release.aar')2.2设置权限
开发者可以根据实际应用需要,设置应用所需权限。
进入“app/src/main”目录,打开“AndroidManifest.xml”文件,添加权限。
publicclassMyZPNsReceiverextendsZPNsMessageReceiver{//厂商透传消息回调@OverrideprotectedvoidonThroughMessageReceived(Contextcontext,ZPNsMessagemessage){Log.e("MyZPNsReceiver","onThroughMessageReceivedmessage:"+message.toString());}//厂商通知点击回调@OverrideprotectedvoidonNotificationClicked(Contextcontext,ZPNsMessagemessage){Log.e("MyZPNsReceiver","onNotificationClickedmessage:"+message.toString());}//厂商通知展示回调@OverrideprotectedvoidonNotificationArrived(Contextcontext,ZPNsMessagemessage){Log.e("MyZPNsReceiver","onNotificationArrivedmessage:"+message.toString());}//厂商注册离线推送结果回调,可通过该回调获取到PushID@OverrideprotectedvoidonRegistered(Contextcontext,ZPNsRegisterMessagemessage){Log.e("MyZPNsReceiver","onRegistered:message:"+message.getCommandResult());}}根据离线推送接收端的厂商,开发者应选择不同的payload透传字段获取方式,通过ZPNsMessageReceiver回调方法中的ZPNsMessage对象获取在上述方法触发时将ZPNsMessage对象传给该方法,取出payload字段。
staticpublicStringgetZPNsMessagePayload(ZPNsMessagemessage){Stringpayload="";switch(message.getPushSource()){caseXIAOMI:MiPushMessagemiMsg=(MiPushMessage)message.getExtras();payload=miMsg.getExtra().get("payload");break;caseOPPO:DataMessageoppoMsg=(DataMessage)message.getExtras();StringextraJson=oppoMsg.getDataExtra();//将extra转为map后,取key为"payload"的valuebreak;caseHUAWEI:RemoteMessagehuaweiMsg=(RemoteMessage)message.getExtras();payload=huaweiMsg.getDataOfMap().get("payload");break;caseFCM:com.google.firebase.messaging.RemoteMessageremoteMessage=(com.google.firebase.messaging.RemoteMessage)message.getExtras();payload=remoteMessage.getData().get("payload");break;}returnpayload;}根据前提条件集成的第三方厂商离线推送SDK,调用enableHWPush/enableMiPush/enableOppoPush/enableVivoPush接口,启用各厂商的推送功能,然后调用setPushConfig接口,配置第三方推送通道。
ZPNsConfigzpnsConfig=newZPNsConfig();zpnsConfig.enableFCMPush();//FCMzpnsConfig.enableHWPush("HW_APP_ID");//华为zpnsConfig.enableMiPush("MI_APPID","MI_APPKEY");//小米zpnsConfig.enableOppoPush("OPPO_APP_ID","OPPO_APP_KEY","OPPO_APP_SECRET");//OPPOzpnsConfig.enableVivoPush("VIVO_APP_ID","VIVO_APP_KEY");//vivoZPNsManager.getInstance().setPushConfig(zpnsConfig);ZPNsManager.getInstance().registerPush(this.getApplication());注册离线推送功能后,可以通过继承ZPNsMessageReceiver类中的onRegistered回调,获取到离线推送的pushID,向指定设备推送离线消息。
ZPNsManager.getInstance().unregisterPush();4使用ZIMSDK实现离线推送功能ZIM支持在发送单聊消息、发送群组消息时,使用离线推送消息的功能。
4.1发送单聊消息时使用离线推送功能
1.首先开发者需要通过ZIMPushConfig对象,设置离线推送标题、内容、以及其它自定义属性。
ZIMMessageSendConfigsentConfig=newZIMMessageSendConfig();sentConfig.pushConfig=pushConfig;3.发送方调用sendMessage,传入“sentConfig”,向接收方发送单聊消息。
zim.sendMessage(textMessage,"myUserID",ZIMConversationType.PEER,sentConfig,newZIMMessageSentCallback(){@OverridepublicvoidonMessageSent(ZIMMessagemessage,ZIMErrorerrorInfo){}@OverridepublicvoidonMessageAttached(ZIMMessagemessage){}});4.接收方如果处于离线状态,将会在上线后,接收到发送方之前发送的离线消息。
1.开发者通过ZIMPushConfig对象,设置离线推送标题、内容、以及其它自定义属性。
ZIMMessageSendConfigsentConfig=newZIMMessageSendConfig();sentConfig.pushConfig=pushConfig;3.发送方调用sendMessage,传入“sentConfig”,向群组内的所有用户发送消息。
zim.sendMessage(textMessage,"myGroupID",ZIMConversationType.GROUP,sentConfig,newZIMMessageSentCallback(){@OverridepublicvoidonMessageSent(ZIMMessagemessage,ZIMErrorerrorInfo){}@OverridepublicvoidonMessageAttached(ZIMMessagemessage){}});4.群组内的用户,如果有人处于离线状态,将会在上线后,接收到发送方之前发送的群组离线消息。