乐趣区

关于sdk:融云即时通讯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 推送, 国内用户接入几大厂商也就是蓝绿大厂华为小米), 让这条音讯走人家厂商的推送通道给送到你手机上.

  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 之后, 也是能够顺利收到音讯的. 这样才把这个问题给解决掉.

退出移动版