Android FCM 推送无法接收的原因

害怕文章以后找不到了,在此处备份一份

首先讲一下什么样的手机以及状态可以接收 FCM 推送, 以及不同的数据格式会走哪条通道

格式一 

{
    "to": "cvRJ6BXFTQiyB9W5pqcx-E:APA91bE",
    "notification": {
        "title":       "Pickup Offer!",
        "body":        "Address detail",
        "click_action": "yourapp://pickup"
    }
 
}


格式二 

{  
   "to":"dk_FO2LEdlI:APA0",
   "data":{  
             "title":"Pickup Offer!",
            "body":"Address detail",
            "click_action":"yourapp://pickup",
            "event":"PICKUP",
            "address":"Address detail"
   }
}


格式三 

{  
   "to":"dk_FO2LEdlI:APA0",
   "notification": {
        "title":       "Pickup Offer!",
        "body":        "Address detail",
        "click_action": "yourapp://pickup"
   },
   "data":{  
             "title":"Pickup Offer!",
            "body":"Address detail",
            "click_action":"yourapp://pickup",
            "event":"PICKUP",
            "address":"Address detail"
   }
}

一. 国外原生系统:

无论手机和应用处于什么状态,大概率会收到推送, 因为 google 服务是原装的,随系统启动, 所以 Google Service 可以长期后台运行,并且在收到消息后会唤起应用注册的广播或服务,从而唤起应用。

但是不同的推送格式会走不同的通道,在应用运行状态下,百分百会走

FirebaseMessagingService

但是在应用被 Kill 后, 如果接收到格式一的推送, 系统会绕过你的应用直接创建推送,并通过 click_action 来实现点击跳转。

而如果接收到格式二,格式三的推送, 则会走你扩展 MyFirebaseMessagingService 重写的方法

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>


二. 国内定制系统:

在翻墙的环境下,且应用运行状态下, 大概率会收到推送,但在应用被 Kill 后,某些手机版本可以收到格式一的推送。

而格式二三 的推送, 则无法送达的,因为FCM service 被干掉了。

三. 推送率

以上所述的可接收推送都是大概率,但千万别拍着胸脯向PM保证绝对没问题,因为还有很多其它因素导致无法接收,让我们列举一下:

1 网络堵塞,或FCM服务器堵塞, 早上发的消息, 晚上才到

2 应用被杀死时无法接受消息,因为广播或Service无法启动, 打开应用时,会疯狂推送离线消息, 是因为缓存机制,默认4个周的缓存,证据在此

3 优先级过低, 不予打扰用户,证据在此

4 电源管理导致,证据在此,安卓官方三星官方PushWoosh

总结
能不能收到推送,全看你的网络状况以及FCM服务有没有被干掉或禁止, 如果被干掉了, 还要看系统会不会处理显示格式一的推送。

有些手机真的邪乎, 就算是国外版的某些版本三星,也会在杀死App后,不再唤醒App所注册的推送广播或服务


原文链接

猜你喜欢

转载自blog.csdn.net/qq_40150532/article/details/131770278
今日推荐