IMSDK离线推送

2019-08-12 14:01:11 浏览数 (1)

一、概述

云通信 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由于只支持受邀开发者集成,暂时没有给出文档说明。

0 人点赞