一、背景
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,并且带有推送音讯内容,所以咱们能够用雷同形式在利用中注册自定义的播送获取推送音讯,进行统计或者有须要的业务需要。之后也会对其余厂商进行调研,看是否有相似发现。