一、概述

云通信 IM 的终端用户需要随时都能够得知最新消息,而由于安卓手机使用深度定制 Android 系统,对于第三方 App 自启动权限管理很严格,默认情况下第三方 App 都不会在系统的自启动白名单内,App 在后台时容易被系统 kill,因此推荐在安卓设备上集成对应的厂商推送,依赖厂商的系统级服务,推送到达率较高。

二、厂商推送

云通信 IM 目前已经支持了 APNs小米推送华为推送魅族推送vivo 推送、OPPO 推送等厂商推送,具体如下:

推送通道 系统要求 条件说明
APNs iOS iOS 系统推送通道,也是唯一的 iOS 推送通道
vivo 推送 FuntouchOS 并非所有 vivo 机型和版本都支持使用 vivo 推送,SDK 版本 vivo_pushsdk_v2.3.1.jar
华为推送 EMUI 华为移动服务版本 20401300 以上,SDK 版本 push:2.6.3.301
小米推送 MIUI 使用小米推送 MiPush_SDK_Client_3_6_12.jar
魅族推送 Flyme 使用魅族推送 push-internal:3.6.+
OPPO 推送 ColorOS 并非所有 OPPO 机型和版本都支持使用 OPPO 推送。OPPO 目前只有受邀开发者才能集成推送,因此 Demo 暂时没有 OPPO 推送的示例。

三、集成

腾讯云通信官网有比较详细的集成文档,推荐参考。这里只简单说一下集成流程。

1、开通腾讯云通信服务,集成腾讯云通信sdk

2、准备厂商推送证书:在各个厂商推送官网申请开发者资质,创建推送服务获得证书。审批耗时,注意提前申请。

3、把厂商推送证书添加到云通信控制台

4、参考集成文档,在app初始化时注册厂商推送,获取推送token(也称pushId、regId)。

5、参考集成文档,在IM登录成功后上报token到腾讯云通信后台。

6、集成完成。

四、调试

1、控制台

如下图是腾讯云通信控制台vivo官方推送控制台华为官方推送控制台小米官方推送控制台魅族官方推送控制台。参考各个控制台的开通指引文档,去开通各个服务。

2、添加证书

把离线推送证书添加到云通信控制台。每次上传证书都会分配一个证书ID,该证书ID需要填入到SDK代码中。如果更新了证书,会得到一个新的id,此时切记也更新代码中的id。

3、注册获取token

终端集成运行注册推送服务,注册成功就能获取到推送token。

如下图在application里面初始化华为推送套件,在主界面注册华为离线推送,注册成功了就会PushClient.getInstance()里面回调出regID,统称推送token。

4、厂商推送

这时候可以在华为官方离线推送控制台对这个token发送一条消息,终端app在杀掉进程的情况下,会弹出通知栏显示这条离线消息。

5、上报token

终端集成运行,登录im成功后上报推送token,上报成功了,就算是全部完成了。可以接收离线消息了。

6、调试工具

腾讯云通信控制台提供了离线推送调试工具,在开发过程中遇到了离线消息问题,可以使用这个调试工具。如下图

五、原理

1、云通信后台记录的终端状态有三种:online、pushoffline,offline。offline(终端主动调用logout接口断开连接),pushoffline(终端出于online状态时,因为网络异常、进程被杀原因,与后台断开了连接,并没有主动调用logout)。当后台检测到投递对象是offline状态时,后台就不会推送消息(会存储在漫游消息服务器,终端login后,拉取漫游消息);如果是online状态,会直接推送给sdk的推送进程,这就是在线消息。

2、pushoffline状态:当终端是online状态时,进程在手机后台被杀死,云通信后台会更新用户状态是pushoffline;或者当手机持续断网6分钟左右,云通信后台一直没有收到app的心跳包,也会把用户的状态更新成pushoffline。

3、离线消息:推送服务投递消息时,检测到用户状态是pushoffline,就会把离线消息投递给厂商推送,由厂商向他们的设备系统推送进程投递消息。这种“系统推送进程”的保活是远远高于三方app后台进程的保活率的。如果能将三方sdk的保活进程添加到设备的系统进程里面去,保活率也是可以保证的。

六、FAQ

1、安卓app放后台,为什么没有收到离线消息,弹出通知栏

答:安卓app进程退到后台,并不会马上被系统kill,im还是在线状态,不会有离线消息投递下来。如果要体验离线推送,请确保进程被kill、或者断网6分钟(im心跳的保护时长),连接状态变成了pushoffline才会有离线消息投递过来。否则都是在线消息。

    另外请打开app的通知栏权限、不要设置手机免打扰模式。

    iOS app退后台,可以调用deBackground接口通知云通信后台,云通信后台会以离线消息的方式投递消息下来。

2、ios用苹果官网推送可以收到离线消息,但是app发的离线消息收不到,使用调试工具发现未知错误

答:说明获取token没问题,有可能上报token错误、或者证书错误。

    未知错误是不太方便对外暴露的错误信息。

比较常见的原因是:

     ①、ios开发环境、生成环境用的证书不同,请先确认上报的是哪个环境的证书,容易弄混。

     ②、苹果官网的证书过期、密码错误等原因,未知错误可以先重新申请一个证书再运行看看

3、安卓点击通知栏,可以跳转到指定页面吗

答:暂时还不支持,只能按系统标准打开应用。通知栏跳转的pendingIntent数据,需要从云通信后台投递给厂商推送服务时带上,暂时双方还在沟通离线消息转推需要携带的数据规范,后续会支持。

4、安卓通知栏,可以定制样式吗,比如排版、图标、提示音等

答:暂时还不支持,只能根据系统默认的样式,其中小米是支持的,但也比较有局限性,具体参考小米官方离线推送文档。云通信sdk还在优化中,后续会考虑支持

5、app退后台,但是没有被kill,怎么能让消息弹出通知栏呢

答:退后台没有被kill,还是在线状态,在线状态时,消息会通过新消息接口触发onNewmessage,需要开发者在应用层判断当前是在前台还是后台,在后台时就弹出通知栏。

6、通知栏刷出了离线消息,点击打开app,进入到会话页面,怎么获取到这个离线消息呢

答、离线状态,新消息不会触发onNewmessage接口,进入会话页面时,通过拉取漫游消息拉取到这条离线消息。ui刷新推荐使用tuikit

7、我集成华为离线推送,为什么注册token时总是失败。

答、请参考华为官方错误码文档,最常见的是6003:“证书指纹校验:证书指纹错误”。

简单讲就是:必须用release包运行,才能注册token成功。这个release包的签名文件,必须是开通华为离线推送服务时填入的证书指纹。

1、检查是否在华为开发者联盟上配置了正确的证书指纹。登录开发者联盟,点击“会员中心”,在“我的产品”点击需要检查证书指纹应用的服务,在“产品服务列表”界面检查“SHA256证书指纹”配置的信息是否和获取的指纹证书一致,如果不一致请修改,修改后请清理华为移动服务缓存。

2、如果检查都正确,请联系华为方支持人员。

8、华为离线推送的独特点。

答、华为离线推送集成方式有三点比较独特:

1、华为离线推送sdk不只需要集成sdk远程库,还需要集成HMS Agent 套件。参考华为官方集成文档,运行脚本工具下载HMS Agent 套件

2、开通华为离线推送应用,要求填入SHA256 指纹,运行sdk注册推送token时,只有用这个指纹证书签名的包才能注册成功。debug包一定会失败。

3、初始化时,除了初始化sdk,还有初始化HMS Agent 套件,华为官方推荐在主页面初始化HMS Agent 套件,而不是在application里面。腾讯集成文档里面有代码说明,可以参考。

9、我的app需求是要能监听到所有的消息到达,然后唤起另外一个app进程,怎么做到呢。

答、无法做到。所有的在线消息是通过新消息接口(onNewmessage)触发的,还可以监听到。但是一旦IMAPP在后台被kill了,消息就只能通过离线消息的方式,由厂商服务推送到他们的设备系统进程里面,由系统进程弹出通知栏、定义通知栏的点击跳转事件。弹通知栏期间,IMAPP还是kill状态,sdk做不了任何事。

10、我离线推送消息集成有问题啊,helper帮忙看看。

答、请按照上面流程一步步来,确认获取token、上报token、厂商官方推送、腾讯云通信控制台调试工具,这四步有没有问题,可以很快找出原因。腾讯云通信官网离线集成文档写的很详细,代码可以直接复制粘贴使用,能走通离线推送业务。其中oppo由于只支持受邀开发者集成,暂时没有给出文档说明。

文章来源于腾讯云开发者社区,点击查看原文