V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lurui45
V2EX  ›  Android

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

  •  
  •   lurui45 · 2 天前 · 2930 次点击

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

    确保 FCM 在线

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

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

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

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

    确保 FCM 服务未被系统杀掉

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

    • 冻结系统电池应用,或替换成氧 OS 的电池,来实现 GMS 的保活
    • VPN 一直开着,GMS 服务走 VPN 似乎不会就不会被杀掉(存疑)

    应用开启自启动权限

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

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

    其他

    • 原生系统的意义应该是 FCM 服务保活,如果能够在国产系统上实现 FCM 服务不被杀,我觉得没必要刷类原生系统
    • VPN 可以 24h 一直开着,并不耗电,我的用法是按应用分流+策略,没试过单独走策略模式,是否会更耗电如果有好的机场,24h 开着真的可以享受到类似国外的体验,随时用 Google ,推送秒接受。
    • 我个人是需要 Outlook ,Authenticator ,Telegram 能够及时收到推送,这些都是在 Play 商店下载的
    • ColorOS 限制 5 个额外的自启动应用,正常是够用的
    • 微信实现 FCM 比较复杂,但是微信冷启动也挺慢的,一直锁后台似乎也不耗电,不想折腾了
    • 想搞明白到底 FCM 需不需要应用的自启动权限。
    • 关于应用的电池优化,我理解仅需要自启动权限就够了,FCM 通过自启动唤醒应用来接受消息,即使后台被电池优化了,也没关系。
    • 为啥国内的推送服务,哪怕应用彻底死了而且不开自启动,也能收到消息。
    • 有个 FCMFIX ,需要 root ,可以让小米手机不开自启动也能收到推送,https://github.com/kooritea/fcmfix ,有用过的可以讲讲。
    第 1 条附言  ·  1 天前
    根据楼下建议,梯子软件的分流规则要让 GMS 走直连,会更稳定
    40 条回复    2024-12-26 08:50:30 +08:00
    my101du
        1
    my101du  
       2 天前
    看标题我以为是最终实现了。。。原来还是原理说明和猜测。说实话这样的文章太多了。

    同一样的一加,我的机型是 Ace 3V ,已经放弃推送无延迟的尝试了,明年上 iPhone SE4

    1. VPN 不一定稳定,而且也不想 24 小时开着
    2. 自启 + 锁定 + 取消优化
    3. 用 Play 市场的版本

    Outlook Teams Authenticator 消息该延迟还是延迟。Teams 还是看不到别人的当前状态。
    lurui45
        2
    lurui45  
    OP
       2 天前
    @my101du 我测试了一天,挺稳定的,你延迟是不是没一直开着梯子
    NokiaForever
        3
    NokiaForever  
       2 天前   ❤️ 5
    我稳定用没问题,信我的,重度用户,一直稳定使用,国行三星都能稳定使用。
    1 fcm 推送必须必须确保 app 的电池设置为优化,不能是限制。三星和类原生 Android ,每个 app 都有这三个选项(无限制,优化,限制),自启动则是中国 rom 的特色,如果找不到电池选项,就设置 app 允许自启动。
    2 最好代理规则里,fcm 绕过代理,也就是
    alt1-mtalk.google.com,
    alt2-mtalk.google.com,
    alt3-mtalk.google.com,
    alt4-mtalk.google.com,
    alt5-mtalk.google.com,
    alt6-mtalk.google.com,
    alt7-mtalk.google.com,
    alt8-mtalk.google.com,
    mtalk.google.com
    这些个域名绕过代理
    因为走代理容易长连接容易超时连不上
    3 如果是中国大陆版本的系统,可能需要 24 小时开着代理(设备自身,软路由都行)确保能连上 Google 。
    中国大陆系统的三星就是,检测到连不上 Google 还是中国大陆 ip 来着,就会断开 fcm ,有人说这是谷歌给中国大陆的特供 gms 的原因,我以前用中国版 hmd 诺基亚也是这样。
    所以我三星中国版原系统,一直开着代理,fcm 绕过代理,app 电池选项改为优化(中国版除了微信等几个白名单,app 装完都是限制,而任何国际版 Android 默认新应用都是优化),稳定接收各国际 app 推送,闲鱼,bilibili ,知乎,飞书都能走 fcm 。
    Tiande
        4
    Tiande  
       2 天前
    "关掉梯子软件中的允许应用绕过 VPN"
    这一步真的很重要,虽然不保证稳定,但至少大部分时间能用。
    不调这个立马断连
    kisp
        5
    kisp  
       2 天前
    关注一次
    Goooler
        6
    Goooler  
       2 天前 via Android
    NokiaForever
        7
    NokiaForever  
       2 天前
    @my101du 看楼下我发的
    NokiaForever
        8
    NokiaForever  
       2 天前
    @my101du 不想 24 小时开着,可以用国际版系统的手机
    lurui45
        9
    lurui45  
    OP
       2 天前
    @NokiaForever
    1. 我的 ColorOS15 有电池选项,里面是允许后台活动(相当于无限制),还有个自动优化的开关,默认都是打开的。
    2. 这里请教一下你的代理是按应用分流的还是直接用策略?我是按应用分流的我不勾选 GMS 服务应该也相当于直连了,但是这样会不会导致系统把 FCM 杀了? 我等会儿测试一下勾选 GMS 服务代理,但是给加上 mtalk 的直连规则,看看是否更稳定
    3. 你那个 FCM Diagonostic 页面最底下的 Time Connected 可以到多少?会不会重连
    BrokenArrow
        10
    BrokenArrow  
       1 天前
    我是一加 13 cos15

    我 24h 挂梯子( clash 耗电基本上 1%以下),然后把那几个特定的网址设置为 direct ,然后把 outlook 之类的软件放开电源限制,就可以正常收到推送,也许有延迟但是不是非常明显我就无所谓了
    建议不要使用系统工具查看 connect ,否则关掉这个工具的后台就会自动杀掉 fcm 进程,需要等待系统自动重启 fcm
    有一个 fcm 官方的软件可以远程模拟 fcm 给你的手机发送一个通知,用这个可以判断是否正常启用
    believingsee
        11
    believingsee  
       1 天前
    折腾了大半年,最后用回苹果了
    Ritter
        12
    Ritter  
       1 天前
    op 开 vpn 不耗电吗
    liuguangxuan
        13
    liuguangxuan  
       1 天前
    @NokiaForever #3 解决了我的困扰,多谢~
    lurui45
        14
    lurui45  
    OP
       1 天前   ❤️ 1
    @Ritter 成天开,没有明显耗电的感觉,能用一天
    Ritter
        15
    Ritter  
       1 天前
    @lurui45 好的 我试试
    SenLief
        16
    SenLief  
       1 天前
    fcm 国内大部分还是能连到的,应用需要自启动,因为,fcm 推送,需要应用在后台才能通知,如果是遵守规范的 app ,它会留一个通知进程在后台等待 fcm 推送拉起。fcmfix 我现在在用,它可以拉起 app ,而不需要 app 在后台,但是需要有自启动的权限。
    NokiaForever
        17
    NokiaForever  
       1 天前
    @lurui45 我就是 clash 机场默认配置,系统应用都给代理的,只有白名单绕过几个不支持 fcm 的国产 app 。我 clash 规则里面有设置 fcm 走不走代理。软路由三也有。没的话你转换一下配置文件就行了吧。反正我一直稳定。
    NokiaForever
        18
    NokiaForever  
       1 天前
    @Ritter 没觉得,在家软路由,在外手机开,耗电没差
    lurui45
        19
    lurui45  
    OP
       1 天前
    @SenLief 这里有点没理解,如果开启了自启动权限,还需要 fcmfix 干嘛?有了自启动权限 FCM 不就可以拉起 APP 了吗
    lurui45
        20
    lurui45  
    OP
       1 天前
    @NokiaForever #17 我刚在我的策略文件里面加上了 mtalk 直连的规则了,果然 FCM 不断了 。关于 Clash ,我的规则都是公用的一个,PC 和手机都是自己写的一个 YAML 文件,放在 gist 托管。区别就是手机 Clash 有个模式就是可以选择按应用分流,我是开了按应用分流的,只有需要代理的 APP 才勾选上,等于说在规则的基础上叠加了应用分流
    SenLief
        21
    SenLief  
       1 天前
    @lurui45 fcm 推送需要后台有个通知进程驻留,等待 fcm 消息到达后广播上 app 通知,如果没有通知进程,就会广播不到,也就无法拉起 app 通知,fcmfix 做的事情就是常驻后台接收 fcm 广播,然后拉起 app ,这时 app 需要自启动权限才能被拉起,小米不用,因为作者给小米做了设置,本来也是为小米开发的。我不是安卓开发哈,之前只是看过有人写过,我不确定对不对。
    shenyuzhi
        22
    shenyuzhi  
       1 天前
    如果从任务列表把某个 APP 划掉,FCM 推送就收不到了。
    这个是我看到的现象。不知道为啥要这么设计
    ysc3839
        23
    ysc3839  
       1 天前 via Android
    别的系统不知道,MIUI 要开启自启动才能接收广播,以及在后台被唤醒。开启自启动后,应用可以保活,Telegram 开启自启动后就能保活。
    DefoliationM
        24
    DefoliationM  
       1 天前 via Android
    别用国行系统就行了,国行系统锁屏会自动断开 fcm ,而且会把重试时间改为负数导致一直不重新连接。
    hiyoi
        25
    hiyoi  
       1 天前 via Android   ❤️ 1
    三星系统只需要把那个 "Android 系统" 加到代理, FCM 就会自动连上了。那个应用会定期连接 www.google.com, 如果连接失败 FCM 就会断。
    xiaonian233
        26
    xiaonian233  
       1 天前
    我的 color 系统,我都没咋管,偶尔连 tz 我发现它就一直是 connected 了,还挺好的
    xiaonian233
        27
    xiaonian233  
       1 天前
    @xiaonian233 打错了,氧 os 系统
    updateing
        28
    updateing  
       1 天前 via Android
    OriginOS 只需要保持梯子常开、禁止绕过就可以无延迟 FCM 推送了。

    ColorOS 我这样操作以后 FCM 不会断,但是 *#*#426#*#* 里面会经常显示 no response from xxx ,最终没有通知显示出来。自启动权限给了,fcmfix 也装了,都不行,现在没有什么新思路了。
    lurui45
        29
    lurui45  
    OP
       1 天前
    @updateing ColorOS 梯子里添加规则,直连 mtalk 那几个域名试试?但是 GSM 服务要走梯子能访问 google
    l476849560
        30
    l476849560  
       1 天前
    @shenyuzhi 记得有看到过一个说法,谷歌认为你把 app 划掉了,说明不再需要用到这个 app 了,就不会再继续展示
    l476849560
        31
    l476849560  
       1 天前
    @lurui45 微信如果绑定国内手机号 会检测 IP ,得很折腾才可以走 FCM 。但是你如果绑定一个国外的手机号,就可以走 FCM 了。
    helloworldchao
        32
    helloworldchao  
       22 小时 23 分钟前
    以前做推送的时候研究过,我大概记得国内的推送和 iPhone 是一个原理都是可以无后台走系统通道完美接受推送,但是 FCM 的话如果需要接受推送的软件被主动停止,或者在国内系统被后台划走了(这个时候一般在国内系统会处于类似在系统中点击了停止的状态),所以完全无法收到推送,除非它被唤醒或是可以主动拉起。
    Zhzp
        33
    Zhzp  
       22 小时 12 分钟前
    我是索尼手机国行,系统基本就算原生,代理软件设置 FCM 直连,不直连的话一些机场对于 FCM 的长连接会在固定时长断开,我用的这个就是,120 秒断开一次,设置直连就不存在这个问题。
    原生系统是没有自启动管理这个选项,所有 app 安装后默认都是可以自启动的,电池选项里有无限制,优化,受限三个选项,app 安装完默认是优化,实测需要 FCM 推送的选择优化或者受限都可以,我是一直选择受限,不会影响 FCM 的推送,划掉后台卡片也不影响。
    微信目前 FCM 推送需要代理 short.weixin.qq.com dns.weixin.qq.com.cn long.weixin.qq.com 这三个域名。
    lurui45
        34
    lurui45  
    OP
       21 小时 40 分钟前
    @helloworldchao 其实就是国内系统要开应用的自启动权限,原生系统不用开呗
    lurui45
        35
    lurui45  
    OP
       21 小时 37 分钟前
    @Zhzp 是这么回事,代理软件不设置直连 mtalk 会固定时长断开,但是你的类原生系统应该不需要让 FCM 走代理吧,直接直连,而不是通过代理的规则直连。微信 FCM 说是要非大陆手机号绑定的才行
    ginholee
        36
    ginholee  
       21 小时 22 分钟前
    @updateing Originos 需要给应用自启动,禁用电量优化吗?
    Zhzp
        37
    Zhzp  
       17 小时 30 分钟前 via Android
    @lurui45 通过代理直连是因为还要用谷歌的一些国外 app ,所以是全天开着的,微信 fcm 只需要代理我发的这几条域名就可以了,我一直是这么用的,甚至今年更早的时候只要网络支持 ipv6 微信就可以走 fcm ,后来被微信给改了
    lurui45
        38
    lurui45  
    OP
       15 小时 12 分钟前
    @Zhzp #37 微信 FCM 整体用下来感觉怎么样
    Zhzp
        39
    Zhzp  
       13 小时 11 分钟前 via Android
    @lurui45 挺好的,在划掉后台卡片的情况下会有大概 2 秒左右的延迟,不划卡片的话大概不到 1 秒的延迟吧
    updateing
        40
    updateing  
       5 小时 18 分钟前 via Android
    @lurui45 这个不是 FCM 连接断掉的问题,是 FCM 发给 app 的数据被延迟的问题。日志里可以看到 FCM 是即时收了通知的,是传递给 app 时失败了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:08 · PVG 14:08 · LAX 22:08 · JFK 01:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.