一、背景
MobPush 已实现 tcp 形式实时推送,但前提是须要 APP 处于运行模式,离线模式下无奈收到推送,为了解决此问题,进步推送达到率,MobPush 接入华为、小米、oppo、vivo、FCM、魅族六大厂商推送。现因厂商推送达到时,利用无奈获取到告诉信息,所以无奈确认厂商告诉是否真正达到客户端。
经对 FCM 剖析,找到相干计划,无论在线还是离线状态下接管 FCM 厂商音讯都能获取到具体内容,本文将与大家分享 FCM 推送音讯获取小妙招。
二、摸索发现
本次摸索,间接通过 FCM 后盾进行推送,并应用 Google pixel 手机和 oppo 海内手机别离进行试验。当应用 Google pixel 手机时,发现无论利用是否处于运行状态均能收到 FCM 音讯,且在离线状态下收到音讯之后,利用过程被唤醒。当应用 oppo 海外版测试推送时,在线状态失常接管音讯,但在离线状态下无奈收到音讯,通过观察 APP 运行日志发现,每次收不到音讯时 FCM 都会有日志信息:
通过对 FCM sdk 和 google play service 进行反编译,终于在 google play service 的 BroadcastDoneReceiver 类中找到日志出处:
通过搜寻 BroadcastDoneReceiver 的创立和调用栈,最终追溯到 TCP 读取音讯的中央, 具体逻辑是:搜到 tcp 音讯解析之后,创立 BroadcastDoneReceiver 实例,创立 action 为““com.google.android.c2dm.intent.RECEIVE””的 intent,发送有序播送:
依据该接口源码的介绍,以 BroadcastDoneReceiver 实例为参数,零碎会以该实例作为播送的最初接收者,用来获取播送的发送后果,当有利用获取收到播送时会调用 setResult 办法设置后果,并在 BroadcastDoneReceiver 实例中通过 getResult 获取后果,当无利用收到播送时,便有以上所说谬误日志诞生。
进一步摸索,发现利用集成 FCM 后,会在 AndroidManifest.xml 中注册下面说到的 action 对应的播送接收者 FirebaseInstanceIdReceiver,其信息如下图:
查看 FirebaseInstanceIdReceiver 的源码,发现确有告诉音讯的解决逻辑,以及 setResult 的调用,如下图,证实了下面的论断:
于是咱们在利用中自定义播送,并按上图形式注册在 AndroidManifest.xml 中,而后推送 FCM 音讯,惊喜发现能失常接管到播送,并且在播送的 intent 中已带有告诉所有信息。
三、总结
FCM 厂商音讯达到时,无论在线还是离线状态下,都会发送播送 FirebaseInstanceIdReceiver,并且带有推送音讯内容,所以咱们能够用雷同形式在利用中注册自定义的播送获取推送音讯,进行统计或者有须要的业务需要。之后也会对其余厂商进行调研,看是否有相似发现。