fcm 推送原理

166 天前
 Leiseya

您可以使用 FCM 向客户端发送两种类型的消息:

通知消息,有时被称为“显示消息”。此类消息由 FCM SDK 自动处理。

数据消息,由客户端应用处理。

前者类似于 apns 、mipush 之类的,后者是唤醒对应应用自行处理。

FCM 消息简介

2421 次点击
所在节点    Google
18 条回复
TomyJan
166 天前
后者 一般不是叫 透传消息 吗
liyafe1997
166 天前
并不类似,前者也是由 App 处理的,只是不需要你手工写代码,而是由 App (里的 FCM SDK )自动处理,本质上还是需要 App 进程活动,由 App 进程本身发出消息。因此如果把 App 的后台完全压死,FCM 一样收不到。

而像 mipush ,华为 push ,vivopush 这些国产系统的 PUSH 则是真真正正类似 APNS 由系统发出的消息,推送过程完全不需要 App 进程参与。
liyafe1997
166 天前
我之前 po 过一帖子想讨论这个东西,有兴趣可以看看 https://www.v2ex.com/t/945081
cengjingyouni
166 天前
App 不参与,如何加解密
wwhontheway
165 天前
有个疑问,iOS app 不能后台保活,该怎么处理 fcm 的数据通知
Richared
165 天前
@wwhontheway APNS 是系统服务,消息提示过程不需要 APP 自己处理,打开 APP 再刷新。17 年写过推送服务,不清楚现在,但是应该也大差不差。
tyzandhr
165 天前
android service 是一个类似 callback 的东西。两种消息本质上没区别,都要交给对应的 service 处理。
Leiseya
161 天前
@liyafe1997 #2 我们有项目用到了 fcm ,具体测试了。测试结果:使用 1 ,会直接弹通知,点击之后再冷启动从服务器拉取;使用 2 ,会显示已在后台更新,点击后进入 app ,是已经从服务器更新好的。
Leiseya
161 天前
@cengjingyouni 需要加解密
@Leiseya
@Leiseya
@liyafe1997 #3 你说的没错 fcm 是需要应用可以自启动和后台运行的,区别就是 2 可以将通知进行加密。
Leiseya
161 天前
@wwhontheway 很显然,apns 只能处理 fcm 的第一种消息,况且 apns 本身是端对端加密的
Leiseya
161 天前
@liyafe1997 #2 原因是不同的,2 是因为不能自启动,无法处理数据消息。1 其实是脱离应用进行通知推送的,你说的不能的原因是:首次安装但尚未启动的应用以及被用户手动停止(在“管理应用”中)时,应用会处于停止状态。 系统会将 FLAG_EXCLUDE_STOPPED_PACKAGES 添加到所有广播 intent 。这样做是为了防止来自后台服务的广播无意中或不必要地启动已停止应用的组件。fixfcm 其实就是添加相应的 FLAG_INCLUDE_STOPPED_PACKAGES ,来允许启动应用组件。https://developer.android.com/about/versions/android-3.1?hl=zh-cn#launchcontrols
liyafe1997
161 天前
@Leiseya 你提到这个不正好是印证了这点嘛?我也是 fixfcm 用户,它设 FLAG_INCLUDE_STOPPED_PACKAGES 的目的不正是让 Intent 强行把 App 进程拉起来,由 App 的进程来处理 FCM 消息,然后向系统弹 notification 。如果真的脱离应用,比如这个消息是由系统的 GMS 发出的,为什么 FCM 要发 Intent 到目标 App 呢,为什么会跟“STOPPED State”有关呢?

mipush 那是真正的完全脱离应用,由系统的某个服务伪装成目标 App 来发 notification ,所以跟 App 进程状态完全无关,理论上甚至你卸载了目标 App 都能继续推送(当然推的时候会判断一下这个 App 是否存在)。记得以前有个 V2er 做过一个测试,自己编译了一个和拼多多包名一样的 apk 然后安装在小米手机上,通知栏居然还能推拼多多的广告,当时他以为是 MIUI 冒充拼多多弹广告,其实就是 mipush 没做好签名检查,把拼多多推过来的 mipush 按到他的假 App 头上了。不知道这个 bug 现在修了没有。
Leiseya
161 天前
@liyafe1997 #12 我的意思是 1 类通知,其实可以脱离 app 本身,只是系统自动阻止了通知。发 intent 到目标 app ,是为了让其处理 2 类通知。
你可以尝试一下,将 1 类通知的 app 冻结,在 fixfcm 勾选此 app ,就会出现 app 已停止,但同样会推送通知。当然这只限于 1 类由 fcm sdk 处理的消息,不适用 2 类由客户端处理的消息。
liyafe1997
161 天前
@Leiseya 你再试试,FCMFIX 把通知推过去了之后,App 的进程是不是起来了? 1 类通知的实现也是 Intent 发到目标 App ,如果脱离了目标 App ,这个 Intent 由谁收,谁来处理?
Leiseya
160 天前
@liyafe1997 #14 FCM SDK 会代表客户端应用向最终用户设备显示消息
Leiseya
160 天前
@liyafe1997 #14 你试试用黑域、冰箱冻结应用,然后用 fixfcm 勾选,然后发送 1 类消息
liyafe1997
160 天前
@Leiseya 黑域、冰箱冻结应用冻结不就是强制停止嘛。跟你手动点强制停止效果一样,最多黑域/冰箱再加了一些其它佐料(限制)。

“FCM SDK 会代表客户端应用向最终用户设备显示消息”,这个 FCM SDK 不就是 App 的一部分嘛,打包在 App 的 apk&dex 里,代码运行在 App 的进程里的,怎么个“代表”法?我上面说了,只是不用你手工写代码来 handle 消息“而已”,这个消息还是由 App 自身(运行在 App 进程里,Application context 属于 App )来处理,来调 notification 来显示的,只是 FCM SDK 帮你写好了,自动处理,你不用写代码而已。你没写代码,难道就不属于 App 的一部分了嘛?
Leiseya
145 天前
@liyafe1997 #17 经过这么多长时间测试,还是老哥说得对。谢谢解惑

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

https://www.v2ex.com/t/1048270

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

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

© 2021 V2EX