即时通讯
  • iOS
  • Android
  • macOS
  • Windows
  • Web
  • 小程序
  • Flutter : Dart
  • Unity3D
  • uni-app
  • React Native
  • 产品简介
  • 下载
  • 快速开始
    • 跑通示例源码
    • 实现基本消息收发
  • 用户相关
  • 房间相关
  • 群组相关
  • 消息相关
  • 呼叫邀请
  • 会话管理
  • 缓存管理
  • 离线推送
  • 语音组件
  • 客户端 API
  • 服务端 API
  • 迁移方案
  • SDK 错误码
  • 常见问题
  • 文档中心
  • 即时通讯
  • 离线推送
  • 实现离线推送

实现离线推送

更新时间:2023-09-21 14:58

功能简介

本文档适用于开发以下平台的应用:iOS、Android 和 Web。

ZEGO 即时通讯(ZIM)支持离线推送消息的功能。例如在“单聊”或“群组聊天”时,如果您的程序在后台被冻结、或被系统或用户杀掉,与 ZEGO 服务后台的长连接超时断开后,此时如果您已接入“离线推送”功能,ZEGO 后台会为目标用户发送离线推送的消息。

开发者可以通过集成 ZPNs SDK,与 ZIM SDK 搭配使用,实现离线推送功能。

  • Flutter 平台的 ZPNs SDK 需要搭配 ZIM SDK 2.1.5 或以上版本使用。
  • 如需使用 ZPNs Flutter SDK 在 Web 端实现离线推送,SDK 版本需为 2.5.0 或以上。
  • 使用 ZPNs SDK 前,请先在 ZEGO 控制台 自助配置 ZIM 离线推送证书(详情请参考 项目管理 - 即时通讯 - 离线推送配置),若无法配置,请联系 ZEGO 技术支持处理。

方案介绍

ZIM 实现离线推送的方案如下:

/Pics/ZIM/OfflinePush/Android.png

  1. 首先消息接收方(即接收离线消息的用户),开启各厂商的推送通道,向各厂商的推送服务器发送请求,获取 Token。

  2. 各厂商的推送服务器,将 Token 返回给接收方。

  3. 接收方生成 PushID,并向 ZIM 服务器发送请求,绑定用户与 PushID 的关系。

    开发者如果将 ZPNs SDK 与 ZIM SDK 搭配使用,SDK 内部会自动绑定用户与 PushID 的关系,无需特殊处理;如果单独使用 ZPNs SDK,则需自行对接 ZPNs 服务器、实现绑定逻辑。请注意,同一设备切换 userID 前,请调用 zim.logout 接口,该接口会清除 userID 绑定的 PushID。

  4. 发送方开始发送消息,消息存储到 ZIM 服务器。

  5. ZIM 服务器会确认接收方的客户端是否在线。

  6. 如果接收方的客户端不在线,ZIM 服务器会将消息转发给 ZPNs 服务器。

  7. ZPNs 服务器将离线消息转发给各厂商的推送服务器。

  8. 各厂商的服务器将消息通过“离线推送”的方式,推送给接收方;接收方登录后(至少登录一次),即可收到离线消息。

前提条件

在实现“离线推送”功能之前,请确保:

  • 开发环境满足以下要求:

    Android

    • Android Studio 2.1 或以上版本。
    • Android SDK 25、Android SDK Build-Tools 25.0.2、Android SDK Platform-Tools 25.x.x 或以上版本。
    • Android 9.0 或以上版本 Android 设备或模拟器(推荐使用真机)。

    iOS:

    • Xcode 7.0 或以上版本。
    • iOS 11.0 或以上版本且的 iOS 真机设备。
    • iOS 设备已经连接到 Internet。

    Web:

    • 连接海外网络的 Google Chrome 浏览器。
    • 可访问的 HTTPS 域名或 IP 地址。

iOS & Android 端接入流程

1 接入第三方厂商离线推送通道

请参考下列推送集成指南,集成需要使用到的第三方厂商离线推送 SDK,接入各厂商的离线推送通道。

目前支持 Apple、小米、华为、OPPO、vivo 和 Google 的推送:

2 集成 ZPNs SDK

2.1 导入 ZPNs SDK

打开 “pubspec.yaml” 文件,以 “pub” 形式,添加 “zego_zim” 依赖:

dependencies:
flutter:
sdk: flutter
zego_zpns: ^2.5.0

2.2 设置权限

开发者可以根据实际应用需要,设置应用所需权限。

  • 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" />

3 使用 ZPNs SDK 注册离线推送功能

  1. 使用 ZPNsEventHandler 获取回调。

    ZPNsEventHandler 类包含了 ZPNs 中各种事件回调的 static Function,开发者可通过传入 Function 来接收 ZPNs 中的事件回调,处理 SDK 异常、消息通知回调。

    各移动设备厂商对 ZPNsEventHandler 类的回调支持情况如下表所示:

    接口名称 接口说明 厂商支持情况
    厂商注册“离线推送”的结果回调。厂商注册“离线推送”的结果,会统一在此接口抛出,可通过该回调获取到 PushID。
    所有厂商都支持该回调。
    厂商通知点击回调。各厂商的通知点击回调,统一在此接口抛出。
    • Apple:支持该回调。
    • 小米:App 杀死状态下能收到此回调。
    • 华为:不支持该回调。
    • OPPO:不支持该回调。
    • vivo:不支持该回调。
    • Google:不支持该回调
    厂商通知展示回调。厂商通知展示回调,统一在此接口抛出。
    • 苹果: 支持该回调。
    • 小米:App 处于前后台状态下才能收到此回调。
    • 华为:不支持该回调。
    • OPPO:不支持该回调。
    • vivo:不支持该回调。
    • Google: 不支持该回调。
    厂商透传消息回调。各厂商返回的透传消息都会触发该接口,并在此接口抛出通知。
    小米: APP处于前后台状态下才能收到此回调vivo: 不支持该回调华为: APP 处于前后台状态下才能收到此回调谷歌推送: APP 处于前后台状态下才能收到此回调oppo: 不支持该回调苹果: 暂不支持该回调
    使用 ZPNsEventHandler 注册回调示例(以 onRegistered 为例)
    1. 开发者可以自定义一个 ZPNsEventHandlerManager 类,在类中新建一个名为 loadingEventHandler 的静态方法,在该方法中实现 onRegistered,并在该方法触发时打印错误信息和 PushID。

      class ZPNsEventHandlerManager {
          static loadingEventHandler() {
              ZPNsEventHandler.onRegistered = (ZPNsRegisterMessage registerMessage) {
                  log(registerMessage.errorCode.toString());
                  log(registerMessage.errorMessage);
                  log(registerMessage.pushID);
              };
          }
      }
    2. 在开始运行程序时,调用 loadingEventHandler 方法,实现 ZPNsEventHandler 回调。

      void main() {
              runApp(const MyApp());
      
              ZPNsEventHandlerManager.loadingEventHandler();
      }

      此后当 onRegistered 事件触发时,便会在控制台打印 PushID。

  1. 配置安卓第三方推送通道。

    根据 前提条件 集成的第三方厂商离线推送 SDK,修改对应的布尔值,启用各厂商的推送功能,然后调用 setPushConfig 接口,配置第三方推送通道。

    • 配置 FCM 推送

      ZPNsConfig zpnsConfig = ZPNsConfig();
      // 注意,开启 fcm 推送时,其他厂商推送通道不可用
      zpnsConfig.enableFCMPush = true;
      ZPNs.setPushConfig(zpnsConfig);
    • 配置其他厂商推送,以下示例代码以华为为例:

      ZPNsConfig config = ZPNsConfig();
      config.enableHWPush = true;
      config.hwAppID = "Your Huawei ID";
      ZPNs.setPushConfig(config);
  2. 注册离线推送功能。

    调用 registerPush 接口注册离线推送。调用此接口有一定性能开销。

    • 在 iOS 端调用 registerPush 接口时,您需要根据打包时选择的证书为 development 还是 description 而提前填写 ZPNsIOSEnvironment。切换证书时,请更改此枚举。

    • 证书为 development 时,ZPNsIOSEnvironmentDevelopment

    • 证书为 distribution 时,ZPNsIOSEnvironmentProduction

    • 如果您尚不清楚当前所处的 ZPNsIOSEnvironment,请填 ZPNsIOSEnvironment.AutomaticAutomaic 可能受 iOS 系统版本影响,若 iOS 系统进行大版本更新后,请留意 ZPNs 发布日志

    // 注册离线推送。
    // 在 iOS 调用 registerPush 接口时,iOSNotificationArrivedConfig 参数可以用来设置普通弹窗推送在前台到达时,是否展示弹窗、角标、声音,若希望不展示可不填。
    ZPNs.getInstance().registerPush(iOSEnvironment: ZPNsIOSEnvironment.Automatic,iOSNotificationArrivedConfig: ZPNsIOSNotificationArrivedConfig()..isPresentBadge=true..isPresentSound=true..isPresentAlert=true,enableIOSVoIP: true)
    .catchError((onError) {
      if (onError is PlatformException) {
      // Notice exception here
      log(onError.message ?? "");
      }
    });

    注册离线推送功能后,可以通过 ZPNsEventHandler 类中的 onRegistered 回调,获取到离线推送的 pushID,向指定设备推送离线消息。

Web 端接入流程

1 接入 Google 离线推送通道

请参考 Web Google 推送集成指南,集成 Google 离线推送 SDK,接入 Google 离线推送通道。

2 集成 ZPNs SDK

打开 “pubspec.yaml” 文件,以 “pub” 形式,添加 “zego_zpns” 依赖:

dependencies:
flutter:
sdk: flutter
zego_zpns: ^2.5.0

3 使用 ZPNs SDK 注册离线推送功能

  1. 集成 ZIM SDK 并注册离线推送功能。

    调用 registerPush 接口,在 Web 应用上注册离线推送,请先创建 ZIM 实例,等待页面加载完毕后,再进行注册,否则可能失败。

    ZIMAppConfig appConfig = ZIMAppConfig();
    appConfig.appID = 0;
    appConfig.appSign = "";
    
    ZIM.create(appConfig);    
    
    // From firebaseConfig
    ZPNsWebConfig config = ZPNsWebConfig();
    config.apiKey = "";
    config.authDomain = "";
    config.projectID = "";
    config.storageBucket = "";
    config.messagingSenderID = "";
    config.appID = "";
    config.measurementID = "";
    // From Web Push certificates
    config.vapidKey = "";
    
    ZPNs.getInstance().registerPush(webConfig: config);

使用 ZIM SDK 实现离线推送功能

ZIM 支持在发送单聊消息、发送群组消息时,使用离线推送消息的功能。

实现离线功能之前,请参考 发送消息,实现发送单聊/群聊消息的功能。

离线推送单聊消息

  1. 首先开发者需要通过 ZIMPushConfig 对象,设置离线推送标题、内容、以及其它自定义属性。

    ZIMPushConfig pushConfig = ZIMPushConfig();
    pushConfig.title = "离线推送标题";
    pushConfig.content = "离线推送内容";
    pushConfig.payload = "自定义透传字段,非必填";
    pushConfig.resourcesID = "资源ID";
  2. 然后通过 ZIMMessageSendConfig 对象的 pushConfig 参数,配置离线消息的相关配置等。

     ZIMMessageSendConfig sendConfig = ZIMMessageSendConfig();
     sendConfig.pushConfig = pushConfig;
  3. 发送方调用 sendMessage,传入 “sendConfig”,向接收方发送带离线推送配置项的消息。

    ZIM.getInstance()!.sendMessage(ZIMTextMessage(message: 'message'), 'toUserID', ZIMConversationType.peer, sendConfig).then((value) => {}).onError((error, stackTrace) => {});
  4. 接收方如果处于离线状态,将会在上线后,接收到发送方之前发送的离线消息。

离线推送群组消息

  1. 开发者通过 ZIMPushConfig 对象,设置离线推送标题、内容、以及其它自定义属性。

    ZIMPushConfig pushConfig = ZIMPushConfig();
    pushConfig.title = "离线推送标题";
    pushConfig.content = "离线推送内容";
    pushConfig.payload = "自定义透传字段,非必填";
    pushConfig.resourcesID = "资源 ID,非必填";
  2. 然后通过 ZIMMessageSendConfig 对象的 pushConfig 参数,配置离线消息的相关配置等。

    ZIMMessageSendConfig sendConfig = ZIMMessageSendConfig();
    sendConfig.pushConfig = pushConfig;
  1. 发送方调用 sendMessage,传入 “sentConfig”,向群组内的所有用户发送消息。

    ZIM.getInstance()!.sendMessage(ZIMTextMessage(message: 'message'), 'toGroupID', ZIMConversationType.group, sendConfig).then((value) => {}).onError((error, stackTrace) => {});
  2. 群组内的用户,如果有人处于离线状态,将会在上线后,接收到发送方之前发送的群组离线消息。

注销离线推送

若开发者希望某台设备不再接收离线推送,可通过调用 unRegisterPush 接口注销。注销后,发送弹窗推送、静默推送也将不再生效。

ZPNs.getInstance().unregisterPush();

在线调试

集成 ZPNs SDK 和获取 Push ID 后,您可以在 ZEGO 控制台 在线调试 ZIM 离线推送功能,详情请参考控制台的 ZIM 离线推送调试

本篇目录