@
mxalbert1996 我开发过 FCM 应用,之前负责公司 APP 里的推送这一块。
虽然文档是这么写,但实际上 FCM 的工作模式并不是简单的一句“直接由系统处理”就能概括的。
像是小米推送、苹果的 APNs ,都是系统自带的组件来负责从接收推送内容到呈现通知推送的全流程。
仅当你点击了通知,或者是国内推送平台所谓的“透传通知”时,系统才会真正唤醒相应的 APP 处理推送内容。
FCM 并不是这种设计。它的职责只有统一收取推送内容,然后转发给 APP 。系统只负责一件事情:统一各种 APP 与推送服务之间的网络连接。
在 FCM 接收到通知之后,其实没有“把通知显示出来”的能力。最终都由 APP 自己处理。
文档中提到的“FCM SDK”并不是一个系统组件(系统组件也不会叫做 SDK……),而是集成到 APP 内部的一个模块,封装了接收和处理通知的逻辑。如果 APP 不能启动,那么其中的 FCM SDK 也不能帮你把通知显示出来。
如果你把应用关闭/杀死了,此时系统会短暂唤醒 APP ,然后走 APP 里的逻辑。消息类型并不会改变这一点,只是 FCM SDK 简化了应用开发,不需要用户自己创建通知罢了。原文是:“此类消息由 FCM SDK 自动处理”。
在你发的连接里,其实下面还有几句话:
“当您的应用在后台运行时,如果您希望 FCM SDK 自动处理通知的显示,请使用通知消息”
“应用在后台运行时,通知消息将被传递至通知面板。应用在前台运行时,消息由回调函数处理”
里面总会提到“运行”这一点,其实挺准确的。只是没有提到应用被杀死时会被 FCM 唤醒……
完全禁止应用后台自启动的情况下(无论是国内 ROM 限制,还是用 Xposed 修改了系统框架限制),FCM 日志里都是“Failed to broadcast to stopped app *********”。