背景:

最近公司新上的app要加上即时通讯的性能, 本人疾速实现一个当然是不可能的了(我的项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的有余.最初点兵点将,选了融云家的SDK(老板说了算hhhh). 这是他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4 因为咱们有些客户是海内的, 海内用户根本都是在用含有google原生Rom原生推送的手机, 所以得接入FCM推送来保障音讯达到率.

  1. 为什么要再接入FCM推送?

集成了即时通讯的SDK, 咱们的app不就能领有像微信一样随时随地收到音讯的即时通讯能力了? 说实话我一开始也是这么认为的. 惋惜做开发也要按基本法来, Android平台回收app的这一关咱都过不了, app都给你杀死得透透的了你拿啥收音讯呢? 咱又不是微信hhhh. 所以一番急赤白脸地浏览他家文档之后, 才发现app如果活着, 他融云能用本人的通道给你把音讯推送到. 如果app被杀死了, 这个音讯就在他家的服务端间接交给三方厂商了(海内用户接入FCM推送, 国内用户接入几大厂商也就是蓝绿大厂华为小米), 让这条音讯走人家厂商的推送通道给送到你手机上.

  1. 融云SDK接入FCM推送指南

https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/fcm.html 这个链接是融云的官网文档, 大家按这个文档接入FCM就行, 接入步骤还是十分具体的.

  1. FCM集成中的须要留神的点

3.1 对于网络环境

融云的SDK会在注册推送的时候检测手机以后的IP是否是一个海内的IP, 如果不是的话就不去注册FCM推送了. 比如说海外版的小米手机, 是带有Google的推送框架的. 然而如果我连贯了一个国内环境的IP, 融云SDK就会判断我在国内环境, 而后依据手机型号, 注册小米推送配置, 如果这台海外版的小米手机没有小米推送框架, 就会注册失败, 从而注册成Rong推送. 这样就失败了. 所以在配置FCM推送做测试的时候, 肯定要保障启动App之前, 手机所在的网络环境是海内的IP(迷信上网).

3.2 没有实现自定义的音讯接管/告诉栏点击监听器(PushMessageReceiver)导致推送失败

这个是对于配置FCM推送的融云官网文档链接. https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/fcm.html#notification 这个页面拉到最下边是一块对于自定义点击跳转的配置 (就是推送音讯达到告诉栏后, 用户手动点击告诉栏音讯后的跳转逻辑). 这个局部我最开始的了解是如果我不继承PushMessageReceiver来自定义点击, 那么SDK会有一套默认的逻辑来实现跳转. 后果却是我不自定义的话, 这个推送就无奈达到了, 相当于没有注册播送接收器, 推送的播送就齐全收不到了. 这个融云他们曾经针对这个问题批改了文档. 强制须要实现自定义点击的接收器了. 除了继承PushMessageReceiver这个类, 不要忘了在AndroidManifest做配置哦.

3.3 奇怪的问题(推送失败和利用打包形式无关)

这个也是十分奇怪的问题了, 先来形容下问题:

1.所有都配置实现之后, 开始测试. 第一次启动App, 杀死. 发送测试音讯. 收不到推送. 2.再次启动App, 杀死, 发送测试音讯. 这次能收到推送了.

第一次杀死App之后, 发送测试音讯, 能够看到log中会即时打出:

09-17 11:50:34.298 W/GCM ( 2025): broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.rongcloud.fcm_demo (has extras) }

GCM打出的log, result=CANCELLED. 播送的intent发送回调是: cancelled. 也就是这个播送还没发送到app层/sdk层, 就曾经被零碎拦挡到了. 失败了.

最开始认为是App对于GCM, 或者FCM的权限问题. 在manifest里脱漏了某个配置, 或者App的告诉权限没有关上. 然而做了一番查看以及配置之后, 这个问题还是存在. 之后求助于Google和StackOverflow, 发现有些人是遇到过相似问题的, 然而都没有一个很好的解决方案, 把网上的解决办法一一尝试之后, 这个固执的问题还是存在.

起初也是一个偶尔的发现, 如果我在IDE中间接点击“Run”把App装置运行到手机上, 会呈现这个问题, 然而我把我的项目打包成apk后, 再装置到手机上. 这个问题就隐没了, 第一次杀死App之后, 也是能够顺利收到音讯的. 这样才把这个问题给解决掉.