折腾 WeChat 推送之路
前言
好久之前把 WeChat 从国区转移到国际服了,终于看不到 WeChat 有广告了,功能也没啥影响,而且处处都有的隐私条款,每使用一个 Mini Program 都会让你进行个人信息授权(Weixin 是默认授权,所以没有这一步),授权后才能使用 WeChat 登录。唯一有个缺点,WeChat 无后台的推送不及时,甚至无推送。当然,我不喜欢 WeChat 时刻在前台活跃,只希望其待在后台待机 or 无后台,然后还有推送。
探究 WeChat 推送条件
当然,WeChat 本身就有推送,但是我不希望 WeChat 使用自己的推送渠道去推送自己,既然都是国际服了,我想让它走 FCM(Firebase Cloud Messaging)推送渠道,但是 WeChat 的默认行为是不会主动去走这个推送渠道,能保活自己推送,就不会走这个 FCM。那么第一步就是想办法让它处于一个无法使用自身去推送的状态。那么也简单,强迫其在挂后台后进行待机 or 清掉后台,这样就处于一个无法使用自身去推送的状态,达成第一个目的,迫使 WeChat 注册 FCM 推送。但这里其实有个疑问,如果不走代理,WeChat 会在使用一段时间 FCM 后想办法唤醒自身等让自己处于前台状态,表现得非常不乖。而且这种状态下的推送非常不稳定,也不一定走 FCM,不符合我的期望。那就让 WeChat 走代理,且 DNS 也是用国外 DNS,假装是一个国外用户的情况。在这种状态下,WeChat Push 在自己不可达的情况下,会主动注册 FCM,且使用 FCM 推送。那么 WeChat 使用 FCM 推送的条件就是 FCM + WeChat 都需要走代理。
那么规则如下
- DOMAIN-KEYWORD,long.wechat,proxy
- DOMAIN-KEYWORD,short.wechat,proxy
- DOMAIN-KEYWORD,long.weixin,proxy
- DOMAIN-KEYWORD,short.weixin,proxy
- DOMAIN-KEYWORD,google,proxy
- DOMAIN-KEYWORD,dns.weixin,REJECT
如何实现无后台推送
上文已经探究明白了,FCM + WeChat 的组合是需要代理,且 WeChat Push 不可达。但是这种情况下,WeChat 还是挂在后台占用资源的,因为在我的手机上无后台的启动速度和后台待机的启动速度差不多。FCM 推送原理和 iOS 那套不一样,FCM 消息推送大概如下 WeChat Message -> WeChat Server -> FCM Server -> FCM Client -> WeChat Push,那么这么一套推送流程的话,是需要 WeChat Push 驻留后台,然后 FCM 接收到消息后唤醒 WeChat Push,然后才能推送这条消息。如果 WeChat 后台全被杀掉了,这个推送流程是失败的,还是接收不到 WeChat 的推送。这和我的目标不符合。这个时候我盯上了 fcmfix 这个模块,因为它可以实现退出后台后,接收到来自 FCM 的推送消息,拉起 WeChat 去处理推送消息,达到我想要的目标。经过简单使用,符合需求。
如何实现稳定的推送
WeChat + FCM + fcmfix,这套组合已经实现了无 WeChat 后台推送,但是有一个问题,当网络不稳定下(移动网络),会导致 FCM 多次中断重连,因为 WeChat 没有启动,不会重新注册 FCM,会导致无法接收到推送,然而我也不能时时刻刻打开 WeChat,让它去注册 FCM。这个时候我又盯上了 Thanox Pro 这个软件,这个可以实现 FCM 中断后,自己接受 FCM 推送消息,然后直接推送,这样的话就不需要我在外面时刻盯着手机,看看 WeChat 有没有注册成功,我能直接看到 WeChat 有消息,这就 OK 了。而且此时 Thanox Pro 有个功能我很喜欢,记录通知栏的信息,有的时候我会因为点击进去了,但是 APP 不知道抽什么风,没有成功进入应该的页面,但是内容已经移除了,我没办法细看我到底是因为什么内容点进去的。Thanox Pro 的 WeChat Push 功能大概如下:
唯一的缺点是,在英文环境下,依旧叫做“微信推送”。
而且这个软件还提供了乖巧模式,把 WeChat 加入乖巧模式,也是个不错的办法。
后记
也许 iOS 用户读到这里,目瞪口呆,强迫 APP 走自己的系统的推送有这么难么?对于 WeChat 来说确实如此,只有它自己和 FCM 可选,QQ 好歹都接入了 OPPO Push,WeChat 却非常高傲,拒绝接入国内任何一个 OEM Push,而且还试图绕过 Android System API 去直接获得想要的资源,它太重,太臃肿了。说实话,我在 iOS 上见过流畅的 WeChat,但是在 Android 上,每次打开 APP 然后启动 Mini Program 的瞬间的卡顿,一度让我怀疑我的手机不行,但是别人的 Mi 13 等机器也并没有表现得特别流畅,总是会卡顿一下,不知道为何。Android 用户太难了,本来有统一推送渠道 FCM,结果因为各种原因,各个 OEM 自建自己的推送渠道,QQ 倒是尝试接入了各个渠道,WeChat 索性开摆了,也就 Play Store 版本的 WeChat 接入了 FCM。
Update
没想到 Weixin 居然给国内版本也开放了 FCM,但是国内 OEM 对 GMS 的保活似乎存在优先级问题,小米这边锁屏后会冻结 GMS,影响 FCM 推送,OnePlus 实测没有啥问题。