本文档适用于开发 iOS 和 Android 端应用。
ZEGO 即时通讯(ZIM)支持离线推送消息的功能。例如在“单聊”或“群组聊天”时,如果您的程序在后台被冻结、或被系统或用户杀掉,与 ZEGO 服务后台的长连接超时断开后,此时如果您已接入“离线推送”功能,ZEGO 后台会为目标用户发送离线推送的消息。
开发者可以通过集成 ZPNs SDK,与 ZIM SDK 搭配使用,实现离线推送功能。
ZIM 实现离线推送的方案如下:
)
首先消息接收方(即接收离线消息的用户),开启各厂商的推送通道,向各厂商的推送服务器发送请求,获取 Token。
各厂商的推送服务器,将 Token 返回给接收方。
接收方生成 PushID,并向 ZIM 服务器发送请求,绑定用户与 PushID 的关系。
开发者如果将 ZPNs SDK 与 ZIM SDK 搭配使用,SDK 内部会自动绑定用户与 PushID 的关系,无需特殊处理;如果单独使用 ZPNs SDK,则需自行对接 ZPNs 服务器、实现绑定逻辑。请注意,同一设备切换 userID 前,请调用 zim.logout 接口,该接口会清除 userID 绑定的 PushID。
发送方开始发送消息,消息存储到 ZIM 服务器。
ZIM 服务器会确认接收方的客户端是否在线。
如果接收方的客户端不在线,ZIM 服务器会将消息转发给 ZPNs 服务器。
ZPNs 服务器将离线消息转发给各厂商的推送服务器。
各厂商的服务器将消息通过“离线推送”的方式,推送给接收方;接收方登录后(至少登录一次),即可收到离线消息。
在实现“离线推送”功能之前,请确保:
开发环境满足以下要求:
已在 ZEGO 控制台 创建项目,获取到了接入 ZIM SDK 服务所需的 AppID、AppSign。ZIM 服务权限不是默认开启的,使用前,请先在 ZEGO 控制台 自助开通 ZIM 服务(详情请参考控制台的 服务配置 - 即时通讯 - 开通服务),若无法开通 ZIM 服务,请联系 ZEGO 技术支持开通。
已集成 ZIM SDK,详情请参考 快速开始 - 实现基本收发消息 的 “2 集成 SDK”。
请参考下列推送集成指南,集成需要使用到的第三方厂商离线推送 SDK,接入各厂商的离线推送通道。
目前支持 Apple、小米、华为、OPPO、vivo 和 Google 的推送:
开发者可以使用 npm 获取 SDK。
进入您的项目的根目录,执行以下命令安装依赖。
npm i zego-zpns-react-native
yarn add zego-zpns-react-native
导入 SDK。
// 当SDK版本小于 2.3.0 时,您可以使用默认方法导入`zego-zpns-react-native` SDK。
// import ZPNs from 'zego-zpns-react-native';
// 然而,所有版本的SDK都支持使用命名方法导出`zego-zpns-react-native` SDK。
import { ZPNs } from 'zego-zpns-react-native';
完成如上操作即可在项目中通过 javascript 或 typescript (推荐) 来使用 zego-zpns-react-native。
开发者可以根据实际应用需要,设置应用所需权限。
iOS:
调用 applyNotificationPermission 接口,向用户申请通知权限。本接口仅第一次调用时生效,请开发者注意调用时机。
ZPNs.getInstance().applyNotificationPermission();
Android:
进入 “app/src/main” 目录,打开 “AndroidManifest.xml” 文件,添加权限。
<!-- ZPNs SDK 必须使用的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
使用 ZPNsEventHandler 获取回调。
ZPNsEventHandler 类包含了 ZPNs 中各种事件回调的 Function,开发者可通过传入 Function 来接收 ZPNs 中的事件回调,处理 SDK 异常、消息通知回调。
各移动设备厂商对 ZPNsEventHandler 类的回调支持情况如下表所示:
| 接口名称 | 接口说明 | 厂商支持情况 |
|---|---|---|
厂商注册“离线推送”的结果回调。厂商注册“离线推送”的结果,会统一在此接口抛出,可通过该回调获取到 PushID。 |
所有厂商都支持该回调。 |
|
厂商通知展示回调。厂商通知展示回调,统一在此接口抛出。 |
|
|
厂商透传消息回调。各厂商返回的透传消息都会触发该接口,并在此接口抛出通知。 |
|
开发者可以通过监听 registered 回调获取 ZPNs 注册结果,并在该方法触发时打印 PushID。
ZPNs.getInstance().on('registered', function(message) {
console.log('[ZPNs] registered. pushID: ' + message.pushID + ', error: ' + message.errorCode)
});
ZPNs.getInstance().on('notificationArrived', function(message) {
console.log('[ZPNs] notificationArrived', message)
});
ZPNs.getInstance().on('throughMessageReceived', function(message) {
console.log('[ZPNs] throughMessageReceived', message)
});
配置安卓第三方推送通道。
根据 前提条件 集成的第三方厂商离线推送 SDK,修改对应的布尔值,启用各厂商的推送功能,然后调用 setPushConfig 接口,配置第三方推送通道。
ZPNs.setPushConfig({"enableFCMPush": true, "enableHWPush": true, "enableMiPush": true, "enableOppoPush": true, "enableVivoPush": true});
调用 enableDebug 设置当前项目的编译环境是否为 Debug,默认为 false。此操作是为了通知 ZPNs SDK 是否为 Debug 环境,PushID 的生成规则受此影响,请在调用 registerPush 接口前正确设置。
如果设置为 true,release 环境下无法收到推送。
ZPNs.enableDebug(true);
调用 registerPush 接口注册离线推送。
在 iOS 端调用 registerPush 接口时,您需要根据打包时选择的证书为 development 还是 description 而提前填写 ZPNsIOSEnvironment。切换证书时,请更改此枚举。
证书为 development 时,ZPNsIOSEnvironment 为 Development。
证书为 distribution 时,ZPNsIOSEnvironment 为 Production。
如果您尚不清楚当前所处的 ZPNsIOSEnvironment,请填 ZPNsIOSEnvironment.Automatic。Automaic 可能受 iOS 系统版本影响,若 iOS 系统进行大版本更新后,请留意 ZPNs 发布日志是否存在相关更新说明。
// 在 iOS 调用 registerPush 接口时,iOSNotificationArrivedConfig 参数可以用来设置普通弹窗推送在前台到达时,是否展示弹窗、角标、声音,若希望不展示可不填。
// enableIOSVoIP 接口用于标记是否使用 iOS VoIP 推送类型。
ZPNs.getInstance().registerPush({enableIOSVoIP:true, iOSEnvironment:ZPNsIOSEnvironment.Automatic,iOSNotificationArrivedConfig:{isPresentAlert:true,isPresentSound:true,isPresentBadge:true}});
注册离线推送功能后,可以通过 ZPNsEventHandler 类中的 registered 回调,获取到离线推送的 pushID,向指定设备推送离线消息。
ZIM 支持在发送单聊消息、群组消息和呼叫邀请时使用离线推送功能。
首先开发者需要通过 ZIMPushConfig 对象,设置离线推送标题、内容、以及其它自定义属性。
var pushConfig = {
title = "离线推送标题";
content = "离线推送内容";
// extendedData = "自定义透传字段,非必填"; // ZIM 版本 < 2.5.0 时使用该字段
// payload = "自定义透传字段,非必填"; // ZIM 版本 >= 2.5.0 时使用该字段
resourcesID = "资源 ID,非必填";
}
然后通过 ZIMMessageSendConfig 对象的 pushConfig 参数,配置离线消息的相关配置等。
var sendConfig = {
priority: 2,
pushConfig: pushConfig
};
发送方调用 sendMessage,传入 sendConfig,向接收方发送单聊消息。
var toUserID = '';
var messageTextObj = { type: 1, message: '文本消息内容' };
zim.sendMessage(messageTextObj, toUserID, 0, sendConfig)
.then(function ({ message }) {
// 发送成功
})
.catch(function (err) {
// 发送失败
});
接收方如果处于离线状态,将会在上线后,接收到发送方之前发送的离线消息。
开发者通过 ZIMPushConfig 对象,设置离线推送标题、内容、以及其它自定义属性。
var pushConfig = {
title = "离线推送标题";
content = "离线推送内容";
// extendedData = "自定义透传字段,非必填"; // ZIM 版本 < 2.5.0 时使用该字段
// payload = "自定义透传字段,非必填"; // ZIM 版本 >= 2.5.0 时使用该字段
resourcesID = "资源 ID,非必填";
}
然后通过 ZIMMessageSendConfig 对象的 pushConfig 参数,配置离线消息的相关配置等。
var sendConfig = {
priority: 2,
pushConfig: pushConfig
};
发送方调用 sendMessage,传入 “sentConfig”,向群组内的所有用户发送消息。
var toGroupID = '';
var messageTextObj = { type: 1, message: '文本消息内容' };
zim.sendMessage(messageTextObj, toGroupID, 2, sendConfig)
.then(function ({ message }) {
// 发送成功
})
.catch(function (err) {
// 发送失败
});
群组内的用户,如果有人处于离线状态,将会在上线后,接收到发送方之前发送的群组离线消息。
开发者通过 ZIMPushConfig 对象,设置离线推送标题、内容、以及其它自定义属性。
var pushConfig = {
title = "离线推送标题";
content = "离线推送内容";
// extendedData = "自定义透传字段,非必填"; // ZIM 版本 < 2.5.0 时使用该字段
// payload = "自定义透传字段,非必填"; // ZIM 版本 >= 2.5.0 时使用该字段
resourcesID = "资源 ID,非必填";
}
然后通过 ZIMCallInviteConfig 对象的 pushConfig 参数,配置离线消息的相关配置等。
var callInviteConfig = {
timeout: 90,
pushConfig: pushConfig
}
发送方调用 callInvite,传入 “callInviteConfig”,发起呼叫邀请。
var invitees = ['xxxx']; // 被邀请人ID列表
zim.callInvite(invitees, callInviteConfig)
.then(function({ callID, timeout, errorInvitees }){
// 操作成功
// 此处的 callID 是用户发起呼叫后,SDK 内部生成的 ID,用于唯一标识一次呼叫邀请;之后发起人取消呼叫、被邀请人接受/拒绝呼叫,都会使用此 callID
})
.catch(function(err){
// 操作失败
})
被邀请的用户若处于离线状态,将会收到对应的离线推送,上线后,若呼叫邀请还未结束,将会收到 callInvitationReceived 回调。
若开发者希望某台设备不再接收离线推送,可通过调用 unRegisterPush 接口注销。注销后,发送弹窗推送、静默推送也将不再生效。
ZPNs.getInstance().unregisterPush();
集成 ZPNs SDK 和获取 Push ID 后,您可以在 ZEGO 控制台 在线调试 ZIM 离线推送功能,详情请参考控制台的 ZIM 离线推送调试。

联系我们
文档反馈