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

fcm 推送原理

  •  
  •   Leiseya · 157 天前 · 2376 次点击
    这是一个创建于 157 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    FCM 消息简介

    18 条回复    2024-07-01 15:28:30 +08:00
    TomyJan
        1
    TomyJan  
       157 天前
    后者 一般不是叫 透传消息 吗
    liyafe1997
        2
    liyafe1997  
       157 天前
    并不类似,前者也是由 App 处理的,只是不需要你手工写代码,而是由 App (里的 FCM SDK )自动处理,本质上还是需要 App 进程活动,由 App 进程本身发出消息。因此如果把 App 的后台完全压死,FCM 一样收不到。

    而像 mipush ,华为 push ,vivopush 这些国产系统的 PUSH 则是真真正正类似 APNS 由系统发出的消息,推送过程完全不需要 App 进程参与。
    liyafe1997
        3
    liyafe1997  
       157 天前
    我之前 po 过一帖子想讨论这个东西,有兴趣可以看看 https://www.v2ex.com/t/945081
    cengjingyouni
        4
    cengjingyouni  
       157 天前 via Android
    App 不参与,如何加解密
    wwhontheway
        5
    wwhontheway  
       156 天前
    有个疑问,iOS app 不能后台保活,该怎么处理 fcm 的数据通知
    Richared
        6
    Richared  
       156 天前
    @wwhontheway APNS 是系统服务,消息提示过程不需要 APP 自己处理,打开 APP 再刷新。17 年写过推送服务,不清楚现在,但是应该也大差不差。
    tyzandhr
        7
    tyzandhr  
       156 天前   ❤️ 1
    android service 是一个类似 callback 的东西。两种消息本质上没区别,都要交给对应的 service 处理。
    Leiseya
        8
    Leiseya  
    OP
       152 天前
    @liyafe1997 #2 我们有项目用到了 fcm ,具体测试了。测试结果:使用 1 ,会直接弹通知,点击之后再冷启动从服务器拉取;使用 2 ,会显示已在后台更新,点击后进入 app ,是已经从服务器更新好的。
    Leiseya
        9
    Leiseya  
    OP
       152 天前
    @cengjingyouni 需要加解密
    @Leiseya
    @Leiseya
    @liyafe1997 #3 你说的没错 fcm 是需要应用可以自启动和后台运行的,区别就是 2 可以将通知进行加密。
    Leiseya
        10
    Leiseya  
    OP
       152 天前
    @wwhontheway 很显然,apns 只能处理 fcm 的第一种消息,况且 apns 本身是端对端加密的
    Leiseya
        11
    Leiseya  
    OP
       152 天前
    @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
        12
    liyafe1997  
       152 天前
    @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
        13
    Leiseya  
    OP
       152 天前
    @liyafe1997 #12 我的意思是 1 类通知,其实可以脱离 app 本身,只是系统自动阻止了通知。发 intent 到目标 app ,是为了让其处理 2 类通知。
    你可以尝试一下,将 1 类通知的 app 冻结,在 fixfcm 勾选此 app ,就会出现 app 已停止,但同样会推送通知。当然这只限于 1 类由 fcm sdk 处理的消息,不适用 2 类由客户端处理的消息。
    liyafe1997
        14
    liyafe1997  
       151 天前 via iPad
    @Leiseya 你再试试,FCMFIX 把通知推过去了之后,App 的进程是不是起来了? 1 类通知的实现也是 Intent 发到目标 App ,如果脱离了目标 App ,这个 Intent 由谁收,谁来处理?
    Leiseya
        15
    Leiseya  
    OP
       151 天前
    @liyafe1997 #14 FCM SDK 会代表客户端应用向最终用户设备显示消息
    Leiseya
        16
    Leiseya  
    OP
       151 天前
    @liyafe1997 #14 你试试用黑域、冰箱冻结应用,然后用 fixfcm 勾选,然后发送 1 类消息
    liyafe1997
        17
    liyafe1997  
       150 天前
    @Leiseya 黑域、冰箱冻结应用冻结不就是强制停止嘛。跟你手动点强制停止效果一样,最多黑域/冰箱再加了一些其它佐料(限制)。

    “FCM SDK 会代表客户端应用向最终用户设备显示消息”,这个 FCM SDK 不就是 App 的一部分嘛,打包在 App 的 apk&dex 里,代码运行在 App 的进程里的,怎么个“代表”法?我上面说了,只是不用你手工写代码来 handle 消息“而已”,这个消息还是由 App 自身(运行在 App 进程里,Application context 属于 App )来处理,来调 notification 来显示的,只是 FCM SDK 帮你写好了,自动处理,你不用写代码而已。你没写代码,难道就不属于 App 的一部分了嘛?
    Leiseya
        18
    Leiseya  
    OP
       136 天前
    @liyafe1997 #17 经过这么多长时间测试,还是老哥说得对。谢谢解惑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1302 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:04 · PVG 02:04 · LAX 10:04 · JFK 13:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.