android 的 vpnservice 可以设置是否“允许绕过”,也就是允许不通过 vpnservice ,直连。由于 android 系统认为 fcm 推送服务走直连会有更好的体验,所以只要 vpnservice 允许绕过,fcm 服务器就会走直连。
clashforandroid / clashmetaforandroid 默认都是开着“允许绕过”的,可能是考虑到 fcm 服务器确实有一部分是可用的。但我不知道是不是自从 android 14 开始改了些什么东西,op 遇到的这种问题最近也挺多的。
之前和朋友测试过,通过 *#*#426#*#* 查看 fcm 连接状态发现,vpnservice 关闭的时候,被分配的几个 fcm 服务器 ip 都是归属 google 台湾的,国内可以连上;而开着 vpnservice ,就会分配到国内连不上的 ip 地址,那推送消息自然也就收不到了。具体原因不明。
解决方法应该就两个:要么不允许绕过,强制 fcm 连接通过代理,但推送的速度和稳定性可能会变差(取决于你的代理服务器);要么自己去搜国内可用的 fcm 服务器 ip ,手写 hosts 绑定到
mtalk.google.com 域名上,但没准哪天 ip 有变化你就要跟着改。