融云即时通讯SDK集成 -- FCM推送集成指南(Android平台)
背景:
最近公司新上的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推送, 国内用户接入几大厂商也就是蓝绿大厂华为小米), 让这条消息走人家厂商的推送通道给送到你手机上.
2. 融云SDK接入FCM推送指南
https://docs.rongcloud.cn/v4/views/im/ui/guide/private/notify/push/fcm.html
这个链接是融云的官方文档, 大家按这个文档接入FCM就行, 接入步骤还是非常详细的.
3. 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之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.