融云即时通讯 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 之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.
评论