欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

融云即时通讯SDK集成 – FCM推送集成指南(Android平台)

程序员文章站 2022-06-16 17:06:10
融云即时通讯SDK集成 – FCM推送集成指南(Android平台)背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).这是他家的官网和文档地址:官网:https://www.rongcloud.cn/文档:https://docs.rongcloud.cn/v4因为我们有些客户是海外的, 海外用户基本都是在用含...

融云即时通讯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和*, 发现有些人是遇到过类似问题的, 但是都没有一个很好的解决方案, 把网上的解决方法一一尝试之后, 这个顽固的问题还是存在.

后来也是一个偶然的发现, 如果我在IDE中直接点击“Run”把App安装运行到手机上, 会出现这个问题, 但是我把项目打包成apk后, 再安装到手机上. 这个问题就消失了, 第一次杀死App之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.

本文地址:https://blog.csdn.net/rongcloud_r/article/details/109645737

相关标签: android