安卓稳定实现 FCM/GSM 推送方法

40 天前
 lurui45

研究了半天如何实现 GMS/FCM 的稳定推送,大概搞明白了原理。其实就是三个条件,确保 FCM 连接,确保 FCM 不被杀,确保应用自启动。

确保 FCM 在线

拨号界面输入*##426##*查看 FCM diagnostics ,如果显示 Connected 表示已连接。

FCM 似乎是可以走 ipv6 直连的,但是有人说不能让它一直裸连

如果开了梯子,一定要关掉梯子软件中的允许应用绕过 VPN ,否则连接会有问题

关掉允许绕过后,连接正常,通过 ipv4 走梯子连接(如果梯子开了按应用分流,需要勾选 com.google.android.gms ),但是似乎会周期性断开然后重连上,不知道什么原因,是否是梯子的问题

确保 FCM 服务未被系统杀掉

由于国产系统魔改了 Android 默认的电池策略,没法设置 GMS 服务的电池策略,系统通常会杀死后台的 GMS 服务,以我用的 OPPO 系的一加 Ace3 ,ColorOS15 系统为例,似乎有两种方法解决该问题。

应用开启自启动权限

有人说 FCM 需要应用自启动,也有的说不需要,按照原理来讲,通知类消息可以直接通过 FCM 接受然后显示在通知栏,与应用的运行状态无关,就像 iphone 一样。如果是数据类消息,需要 FCM 唤醒应用然后由应用接受消息发出通知,这种情况需要自启动权限。

我觉得像 Telegram ,Outlook 这些应用应该是不需要自启动的,但是我实测是关掉自启动就有时候就是不能收到消息,需要打开自启动,搞不懂为什么。

其他

4975 次点击
所在节点    Android
40 条回复
SenLief
40 天前
@lurui45 fcm 推送需要后台有个通知进程驻留,等待 fcm 消息到达后广播上 app 通知,如果没有通知进程,就会广播不到,也就无法拉起 app 通知,fcmfix 做的事情就是常驻后台接收 fcm 广播,然后拉起 app ,这时 app 需要自启动权限才能被拉起,小米不用,因为作者给小米做了设置,本来也是为小米开发的。我不是安卓开发哈,之前只是看过有人写过,我不确定对不对。
shenyuzhi
40 天前
如果从任务列表把某个 APP 划掉,FCM 推送就收不到了。
这个是我看到的现象。不知道为啥要这么设计
ysc3839
40 天前
别的系统不知道,MIUI 要开启自启动才能接收广播,以及在后台被唤醒。开启自启动后,应用可以保活,Telegram 开启自启动后就能保活。
DefoliationM
39 天前
别用国行系统就行了,国行系统锁屏会自动断开 fcm ,而且会把重试时间改为负数导致一直不重新连接。
hiyoi
39 天前
三星系统只需要把那个 "Android 系统" 加到代理, FCM 就会自动连上了。那个应用会定期连接 www.google.com, 如果连接失败 FCM 就会断。
xiaonian233
39 天前
我的 color 系统,我都没咋管,偶尔连 tz 我发现它就一直是 connected 了,还挺好的
xiaonian233
39 天前
@xiaonian233 打错了,氧 os 系统
updateing
39 天前
OriginOS 只需要保持梯子常开、禁止绕过就可以无延迟 FCM 推送了。

ColorOS 我这样操作以后 FCM 不会断,但是 *#*#426#*#* 里面会经常显示 no response from xxx ,最终没有通知显示出来。自启动权限给了,fcmfix 也装了,都不行,现在没有什么新思路了。
lurui45
39 天前
@updateing ColorOS 梯子里添加规则,直连 mtalk 那几个域名试试?但是 GSM 服务要走梯子能访问 google
l476849560
39 天前
@shenyuzhi 记得有看到过一个说法,谷歌认为你把 app 划掉了,说明不再需要用到这个 app 了,就不会再继续展示
l476849560
39 天前
@lurui45 微信如果绑定国内手机号 会检测 IP ,得很折腾才可以走 FCM 。但是你如果绑定一个国外的手机号,就可以走 FCM 了。
helloworldchao
39 天前
以前做推送的时候研究过,我大概记得国内的推送和 iPhone 是一个原理都是可以无后台走系统通道完美接受推送,但是 FCM 的话如果需要接受推送的软件被主动停止,或者在国内系统被后台划走了(这个时候一般在国内系统会处于类似在系统中点击了停止的状态),所以完全无法收到推送,除非它被唤醒或是可以主动拉起。
Zhzp
39 天前
我是索尼手机国行,系统基本就算原生,代理软件设置 FCM 直连,不直连的话一些机场对于 FCM 的长连接会在固定时长断开,我用的这个就是,120 秒断开一次,设置直连就不存在这个问题。
原生系统是没有自启动管理这个选项,所有 app 安装后默认都是可以自启动的,电池选项里有无限制,优化,受限三个选项,app 安装完默认是优化,实测需要 FCM 推送的选择优化或者受限都可以,我是一直选择受限,不会影响 FCM 的推送,划掉后台卡片也不影响。
微信目前 FCM 推送需要代理 short.weixin.qq.com dns.weixin.qq.com.cn long.weixin.qq.com 这三个域名。
lurui45
39 天前
@helloworldchao 其实就是国内系统要开应用的自启动权限,原生系统不用开呗
lurui45
39 天前
@Zhzp 是这么回事,代理软件不设置直连 mtalk 会固定时长断开,但是你的类原生系统应该不需要让 FCM 走代理吧,直接直连,而不是通过代理的规则直连。微信 FCM 说是要非大陆手机号绑定的才行
ginholee
39 天前
@updateing Originos 需要给应用自启动,禁用电量优化吗?
Zhzp
39 天前
@lurui45 通过代理直连是因为还要用谷歌的一些国外 app ,所以是全天开着的,微信 fcm 只需要代理我发的这几条域名就可以了,我一直是这么用的,甚至今年更早的时候只要网络支持 ipv6 微信就可以走 fcm ,后来被微信给改了
lurui45
39 天前
@Zhzp #37 微信 FCM 整体用下来感觉怎么样
Zhzp
39 天前
@lurui45 挺好的,在划掉后台卡片的情况下会有大概 2 秒左右的延迟,不划卡片的话大概不到 1 秒的延迟吧
updateing
38 天前
@lurui45 这个不是 FCM 连接断掉的问题,是 FCM 发给 app 的数据被延迟的问题。日志里可以看到 FCM 是即时收了通知的,是传递给 app 时失败了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1099859

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX