个推推送SDK集成之Device Token

1,220 阅读7分钟

本文已首发微信公众号「code小生」,大家可以搜索关注,专注安卓技术分享。

由来

前段时间给APP增加推送功能,经调研后接收到的结果是集成个推SDK,这从市场使用概率来看很不错,毕竟个推、腾讯TPNS(原名信鸽)、极光、友盟等都是比较流行的厂家服务,但对于开发者来讲,更重要的是官方文档是否易于阅读?官方客服沟通起来是否便捷? ,一份优秀的文档说明可以节约很大的成本,相信各位开发者深有感触吧。

问题产生

个推Android集成官方文档:https://docs.getui.com/getui/mobile/android/androidstudio/

按照上述文档集成完毕后,无论哪款机型,总是获取不到厂商token,但clientId可以获取到,这是问题一。

厂商token有如下两种查看方式,这两种方式并不在集成文档里,而是在Android常见问题里,

  1. 手机连接电脑,手机需开启开发者调试模式,打开APP,在androidstudio编译器logcat中过滤"Assist_",若成功打印token信息则表示厂商集成正常。
  2. 在个推后台【消息推送】-【配置管理】-【应用配置】中正常填写保存厂商参数。然后在个推后台【消息推送】-【配置管理】-【故障排查】-【检测CID的状态及信息:】中输入CID查询,看是否会返回厂商token。

其实还有一种方式,就是官方API提供的接口public void onReceiveDeviceToken(Context context, String deviceToken),但是该接口不是非必须实现的,而这个方法的回调前提是已经获得了厂商token,所以也不能排查啥问题。

从上面两种方式中细心的你应该注意到了细节:厂商集成保存厂商参数

关于保存厂商参数这个很明确,在后台就可以看到,目前只提供了主流手机厂商通道(华为、小米、OPPO、VIVO、海外通道)的配置,如图:

我们需要做的就是在各个应用市场找到我们的应用(因为我的应用是已经上架的,如果是新创建,那么建议在创建的时候就打开)并为其打开推送服务就可以了;需要注意的是,华为需要多一步:在应用的签名信息里配置SHA256的值(如何获取已经上架应用的SHA256的值,华为有给教程哈,很nice)。

这一步还是获取不到厂商token,由此带来的体验是:

服务端发送推送,手机端在线时可以收到,离线后就收不到。而服务端的发送代码是同时发送了通知和透传消息,所以服务端的发送代码不准备修改,是参照demo里写的。

这里又有一个问题,什么是透传消息?该如何理解透传?

关于透传消息,正确的理解是个推和手机厂商合作,所发出的消息会走各个手机厂商的通道,而不仅仅是个推自家的通道,透传并没有“穿透、强度、力度、高级”方面的意思,千万别误解了。透传消息和通知是同级别的不同种类消息送达方式而已。

由于我是第一次集成,项目也是帮忙做,就没细看太多,只取了集成需要的东西,好处是相关人员拉了个个推官方的技术支持群,所以后面我扔了很多问题,但基本答非所问。

再前面配置厂商参数的时候我也注意到oppo还是vivo在打开推送服务的时候,会有透传消息的解释,当时我就感觉后端对我的引导有偏差,经过和技术支持沟通,确定的结果如下:

  • 透传消息只能在线接收到,离线根本就不会收到透传消息
  • 离线能收到的是通知,和透传消息无关

这下就明确了,在这之前的做法是一直纠结为什么离线收不到透传消息,因为后端给我的错误引导是透传应该是离线的时候收到的,它有穿透之意,比通知更高级,这就是我为什么在前面要强调对透传的理解。

进一步根据技术支持的反馈,通知的显示和点击是不需要客户端做处理的,只需要客户端严格按照文档要求配置icon和文本、服务端在发送通知的时候指定跳转页面即可,如果不指定跳转页面默认跳转APP首页。而透传消息的显示需要客户端做处理,也就是显示通知栏的操作,但点击跳转工作同样不需要客户端去做。

探寻解决方案

到这里,基本的思路和逻辑清楚了,但依然有两个问题未解决:

  1. 厂商集成如何做?在哪里?
  2. 为什么获取不到设备token?根据官方提示,如果获取不到设备token,那肯定app离线时收不到通知。

这两个问题都是APP离线时才会触发,其实这两个问题归根结底还是同一个问题,就是厂商未集成。那么问题来了,我翻遍了个推Android集成文档 也就是本文开始给出的链接,但就是找不到集成厂商的步骤,接下来就入坑了,我在各个应用市场翻阅了推送服务相关文档、检查了各个推送服务的配置开关、尝试release测试、换主流手机测试、询问官方技术支持,但都一无所获,技术支持最多的一句回复就是让我看这个:

这个截图其实就是Android常见问题中的第四个问题。

但这不是扯呢么,问题我知道在哪,我就是想知道厂商集成在哪里?我要文档或者链接,最后实在不行了,准备做最后的决战,直接@个推官方技术支持直接要链接,结果给我扔出来一个从未谋面的链接:https://docs.getui.com/getui/mobile/vendor/androidstudio/ 打开后发现,这太坑了吧,瞬间想骂两句,但还是忍住了,因为我最近正在看一本书《人生处处是修行》哈哈。

我们来看下官方文档的整体分布:

Android和多厂商居然是平级关系,更可恨的是集成多厂商之前必须先集成Android个推SDK,也就是我们前面做过的工作。那么接下来就集成呗,照着文档完毕后在控制台果然看到了梦寐以求的device token ,然后再去根据 clientId 查询厂商token,果然有值,需要注意的是离线的测试必须是官方支持的主流机型(前面配置过的机型),华为的需要是release版本才可以测试结果。

解决问题后,跟官方技术支持提供了建议:

应该在Android集成文档里面提及到多厂商集成,或者至少加个超链接吧。得到的回复是他们建议一下,我就知道他们多半不是直接的个推官方技术。

总结

这次之所以爬坑最主要的失误有两个;

  1. 没有提前了解相关术语的目的,被误解带偏
  2. 对于提供的技术支持要有正确的认识(很多其实都是商务,不是官方直接的技术)

额外提及一点,在集成多厂商的时候,碰到关于服务端配置消息(通知和透传消息)点击事件的intent值,官方文档有如下描述:

图中红色部分的配置方式正式Android集成文档里提及的方式,而这里又不建议使用,这不是坑人嘛!我为了安全起见,根据官方提供的生成方式,在安卓端生成后发给后端使用。

各位如遇到本文中的问题希望这里能帮到你,本文已结束。

我是code小生,喜欢可以随手点个评论一下,谢谢~