Google FCM 離線推送簡明教程

FCM轿曙,即Firebase Cloud Messaging


Firebase,F(xiàn)irebase是一家實(shí)時后端數(shù)據(jù)庫創(chuàng)業(yè)公司,它能幫助開發(fā)者很快的寫出Web端和移動端的應(yīng)用帕涌。自2014年10月Google收購Firebase以來噩茄,用戶可以在更方便地使用Firebase的同時下面,結(jié)合Google的云服務(wù)。

Google在今天2016的I/O大會上發(fā)表新版Firebase绩聘,F(xiàn)irebase是專為行動應(yīng)用開發(fā)者所提供的后端服務(wù)平臺(Backend as a Services沥割,BaaS)。新版Firebase增加了免費(fèi)的數(shù)據(jù)分析工具凿菩、云端訊息推播机杜、通知系統(tǒng)、當(dāng)機(jī)報告衅谷、遠(yuǎn)端配置及動態(tài)連結(jié)等功能椒拗,是繼2014年10月Google收購Firebase后,18個月以來的一次大改版会喝。

Android Studio2.2中開始支持Firebase服務(wù)陡叠,如AdMob玩郊、分析、認(rèn)證和通知等枉阵。

一译红、FCM初認(rèn)識

我們知道,當(dāng)我們應(yīng)用被強(qiáng)殺之后兴溜,基本上就是收不到推送消息啦侦厚,或者說叫離線推送。不管是極光拙徽,騰訊信鴿還是阿里推送等刨沦,都是基本上對強(qiáng)殺無解,雖然第三方推送有各種奇技淫巧膘怕,但是只是杯水車薪想诅。

而iOS在離線消息十分靠譜,那是因?yàn)槊恳粋€蘋果可以通過自家服務(wù)器維持一個長鏈接岛心,每一個iOS的推送都必須和蘋果打交道来破,所以這個過程控制得很好。

Google的自己也是維護(hù)一套推送系統(tǒng)忘古,境外開發(fā)者基本推送走的是Google的服務(wù)徘禁,但是由于哈哈哈哈的關(guān)系,在國內(nèi)我們無法使用Google的服務(wù)髓堪,收不到Google的推送送朱,也因此特殊環(huán)境下第三方推送群起,但是強(qiáng)殺之后收到離線消息依然弱爆干旁,除了Google驶沼。

Google以前的推送叫GCM,后來收購FireBase退出的FCM是GCM的升級版疤孕,本質(zhì)用的還是GCM.

  • GCM (Google Cloud Message for Android)是Google發(fā)布的Android服務(wù)器推送(push)技術(shù)商乎。
  • FCM是谷歌推出的最新的Android系統(tǒng)級別的消息推送服務(wù)(用來替換GCM)。

二祭阀、接入FCM

二.1鹉戚、前提

想要使用FCM,需要滿足如下幾個條件

  • 設(shè)備必須是android4.0以上专控,Google Play Services 必須是 11.2.0以上版本
  • Android SDK Manager 必須有Google Play services SDK
  • Android Studio必須是1.5以上版本

其中的難處抹凳,就是用戶手機(jī)必須可以連得上Google Play Services ,這個問題嘛伦腐,交給歷史赢底,如果你的app是面向境外的,那么一切是如此地絲滑。

二.2幸冻、 接入

什么都別說啦粹庞,趕緊看一下Firebase FCM接入文檔

本文是按照文檔接入測試的,你可以自己去看啊洽损,沒錯啊庞溜,到這里你就可以選擇關(guān)閉頁面,如果你愿意看碑定,那么流码,continue。

二.2.1延刘、在Firebase控制臺添加自己的應(yīng)用

首先你得有一個Google賬號嘛漫试,然后登錄Firebase的控制臺

創(chuàng)建應(yīng)用

image.png

.
選擇添加到安卓應(yīng)用


image.png

.

下載生成的文件名為 “google-services.json”的文件,放在應(yīng)用級別的文件目錄下

image.png

.

image.png

期間有個添加包名和sha-1值的過程碘赖,此時添加的是debug的sha-1驾荣,最好在添加完成之后進(jìn)入設(shè)置把release的sha-1值也添加進(jìn)去。然后重新下載更新的“google-services.json”普泡,重新替換到項(xiàng)目里面秘车。

.

二.2.2、添加使用Firebase SDK

以當(dāng)前工程沒使用過Google Services為例子
需要在工程級gradle文件和應(yīng)用級的gradle文件上操作劫哼。

添加SDK

項(xiàng)目gradle

  • buildscript → dependencies
    classpath 'com.google.gms:google-services:3.1.0'
    (最新版本可根據(jù)官網(wǎng)文檔)

  • allprojects → repositories
    maven { url 'https://maven.google.com' }

這點(diǎn)官網(wǎng)無涉及,但是沒加可能會報異常
Failed to resolve: com.google.firebase:firebase-messaging:11.2.0

image.png

.
.

應(yīng)用gradle

  • dependencies
    compile 'com.google.firebase:firebase-messaging:11.2.0'
    compile 'com.google.gms:google-services:3.1.0'

.

  • 在文件的最后添加
    apply plugin: 'com.google.gms.google-services'

這樣代碼不要有潔癖放在頂部割笙,想著所有的apply plugin都放一起权烧,不然很大可能報大概如下錯誤

Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 9.0.0. 

.

image.png

題外話
如果同時也引入google map,firebase的版本要一致伤溉,比如如下

    // 下方的firebase-messaging 和 play-services-maps 和 play-services版本號必須一致
    compile 'com.google.firebase:firebase-messaging:11.2.0'
    compile 'com.google.android.gms:play-services-maps:11.2.0'
    compile 'com.google.android.gms:play-services:11.2.0'// 添加之
    compile 'com.google.gms:google-services:3.1.0'

配置FireBase SDK

唯一Token的獲取和上傳
最初啟動您的應(yīng)用時般码,F(xiàn)CM SDK 會為客戶端應(yīng)用實(shí)例生成一個注冊令牌。如果您希望定位單臺設(shè)備或創(chuàng)建設(shè)備組乱顾,則需要通過繼承 FirebaseInstanceIdService
來訪問此令牌板祝。

當(dāng)您需要檢索當(dāng)前令牌時,請調(diào)用 FirebaseInstanceId.getInstance().getToken()
如果令牌尚未生成走净,此方法將返回 null券时。

.
.
消息的接收監(jiān)聽

  • MyFirebaseMessagingService
/**
 * User: LJM
 * Date&Time: 2017-08-25 & 10:50
 * Describe: 消息接收服務(wù)
 * 推送分為 dataMessage和notification 兩種
 */
public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "FBTEST";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        Log.d(TAG, "收到推送 From: " + remoteMessage.getFrom());

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "收到推送 Message data payload: " + remoteMessage.getData());
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "收到通知 Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
    }

}

.
.
token變化的監(jiān)聽

  • MyFirebaseInstanceIDService
/**
 * User: LJM
 * Date&Time: 2017-08-25 & 10:48
 * Describe: 實(shí)例化令牌服務(wù)
 * 處理創(chuàng)建,輪詢更新Token伏伯,當(dāng)我們推送到執(zhí)行設(shè)備或者設(shè)備組的時候就需要用到這個
 */
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String TAG = "FBTEST";

    @Override
    public void onTokenRefresh() {
        super.onTokenRefresh();
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "刷新Token Refreshed token: " + refreshedToken);

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(refreshedToken);
    }

    /**
     * Persist token to third-party servers.
     *
     * Modify this method to associate the user's FCM InstanceID token with any server-side account
     * maintained by your application.
     *
     * @param token The new token.
     */
    private void sendRegistrationToServer(String token) {
        // TODO: Implement this method to send token to your app server.
    }

}

注冊令牌可能會在發(fā)生下列情況時更改:

  • 應(yīng)用刪除實(shí)例 ID
  • 應(yīng)用在新設(shè)備上恢復(fù)
  • 用戶卸載/重新安裝應(yīng)用
  • 用戶清除應(yīng)用數(shù)據(jù)橘洞。

所以Firebase強(qiáng)烈建議我們復(fù)寫onTokenRefresh方法并且及時上傳更新的Token通知自家服務(wù)器

注冊service
.清單文件注冊service


        <service android:name=".service.MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>

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

        <!--指定圖標(biāo) 可選-->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/shownf" />

        <!--指定顏色 可選-->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorPrimary" />

.
.
至此,配置完成说搅,就等著接消息啦炸枣。

三、接收推送

控制臺發(fā)消息,只可以發(fā)Notification适肠,但是也足夠我們測試?yán)?br> (dataMessage必須服務(wù)器代碼發(fā))

控制臺

.

image.png

發(fā)送即可收到霍衫。

對于 Notification,當(dāng)app處于前臺的是不會接收侯养,至于當(dāng)app處于后臺或者被強(qiáng)殺時收到敦跌,嗯,強(qiáng)殺后能收到沸毁。而dataMessage是前后臺都能收到峰髓。

經(jīng)測試,Pixel 運(yùn)行Oreo 完美接收息尺,但是如果是其他廠商的機(jī)型携兵,想要強(qiáng)殺后繼續(xù)收到離線消息,一般需要在設(shè)置一下


  • 小米【MIUI】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表搂誉,否則殺進(jìn)程或重新開機(jī)后進(jìn)程無法開啟
    • 通知欄設(shè)置:應(yīng)用默認(rèn)都是顯示通知欄通知徐紧,如果關(guān)閉,則收到通知也不會提示
    • 網(wǎng)絡(luò)助手:可以手動禁止已安裝的第三方程序訪問2G/3G和WIFI的網(wǎng)絡(luò)和設(shè)置以后新安裝程序是否允許訪問2G/3G和WIFI的網(wǎng)絡(luò)
    • MIUI 7 神隱模式: 允許應(yīng)用進(jìn)行自定義配置模式炭懊,應(yīng)用在后臺保持聯(lián)網(wǎng)可用并级,否則應(yīng)用進(jìn)入后臺時,應(yīng)用無法正常接收消息侮腹〕氨蹋【設(shè)置】下電量和性能中【神隱模式】
  • 華為【Emotion】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表,否則殺進(jìn)程或重新開機(jī)后進(jìn)程不會開啟父阻,只能手動開啟應(yīng)用
    • 后臺應(yīng)用保護(hù):需要手動把應(yīng)用加到此列表愈涩,否則設(shè)備進(jìn)入睡眠后會自動殺掉應(yīng)用進(jìn)程,只有手動開啟應(yīng)用才能恢復(fù)運(yùn)行
    • 通知管理:應(yīng)用狀態(tài)有三種:提示加矛、允許履婉、禁止。禁止應(yīng)用則通知欄不會有任何提醒
  • 魅族【Flyme】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表斟览,否則殺進(jìn)程或重新開機(jī)后進(jìn)程無法開啟
    • 通知欄推送:關(guān)閉應(yīng)用通知則收到消息不會有任何展示
    • 省電管理: 安全中心里設(shè)置省電模式毁腿,在【待機(jī)耗電管理】中允許應(yīng)用待機(jī)時,保持允許苛茂,否則手機(jī)休眠或者應(yīng)用閑置一段時間已烤,無法正常接收消息。
  • VIVO【Funtouch OS】

    • 內(nèi)存一鍵清理:需要將應(yīng)用加入【白名單】列表妓羊,否則系統(tǒng)自帶的“一鍵加速”草戈,會殺掉進(jìn)程
    • 自啟動管理:需要將應(yīng)用加入“i管家”中的【自啟動管理】列表,否則重啟手機(jī)后進(jìn)程不會自啟侍瑟。但強(qiáng)制手動殺進(jìn)程唐片,即使加了這個列表中丙猬,后續(xù)進(jìn)程也無法自啟動。
  • OPPO【ColorOS】

    • 凍結(jié)應(yīng)用管理:需要將應(yīng)用加入純凈后臺费韭,否則鎖屏狀態(tài)下無法及時收到消息
    • 自啟動管理:將應(yīng)用加入【自啟動管理】列表的同時茧球,還需要到設(shè)置-應(yīng)用程序-正在運(yùn)行里鎖定應(yīng)用進(jìn)程,否則殺進(jìn)程或者開機(jī)后進(jìn)程不會開啟星持,只能手動開啟應(yīng)用
  • 三星

    • 內(nèi)存一鍵優(yōu)化:需要將應(yīng)用加入【白名單】列表抢埋,否則系統(tǒng)內(nèi)存優(yōu)化后,會殺掉應(yīng)用進(jìn)程
  • 小米【MIUI】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表督暂,否則殺進(jìn)程或重新開機(jī)后進(jìn)程無法開啟
    • 通知欄設(shè)置:應(yīng)用默認(rèn)都是顯示通知欄通知揪垄,如果關(guān)閉,則收到通知也不會提示
    • 網(wǎng)絡(luò)助手:可以手動禁止已安裝的第三方程序訪問2G/3G和WIFI的網(wǎng)絡(luò)和設(shè)置以后新安裝程序是否允許訪問2G/3G和WIFI的網(wǎng)絡(luò)
    • MIUI 7 神隱模式: 允許應(yīng)用進(jìn)行自定義配置模式逻翁,應(yīng)用在后臺保持聯(lián)網(wǎng)可用饥努,否則應(yīng)用進(jìn)入后臺時,應(yīng)用無法正常接收消息八回】崂ⅲ【設(shè)置】下電量和性能中【神隱模式】
  • 華為【Emotion】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表,否則殺進(jìn)程或重新開機(jī)后進(jìn)程不會開啟缠诅,只能手動開啟應(yīng)用
    • 后臺應(yīng)用保護(hù):需要手動把應(yīng)用加到此列表溶浴,否則設(shè)備進(jìn)入睡眠后會自動殺掉應(yīng)用進(jìn)程,只有手動開啟應(yīng)用才能恢復(fù)運(yùn)行
    • 通知管理:應(yīng)用狀態(tài)有三種:提示管引、允許士败、禁止。禁止應(yīng)用則通知欄不會有任何提醒
  • 魅族【Flyme】

    • 自啟動管理:需要把應(yīng)用加到【自啟動管理】列表褥伴,否則殺進(jìn)程或重新開機(jī)后進(jìn)程無法開啟
    • 通知欄推送:關(guān)閉應(yīng)用通知則收到消息不會有任何展示
    • 省電管理: 安全中心里設(shè)置省電模式拱烁,在【待機(jī)耗電管理】中允許應(yīng)用待機(jī)時,保持允許噩翠,否則手機(jī)休眠或者應(yīng)用閑置一段時間,無法正常接收消息邦投。
  • VIVO【Funtouch OS】

    • 內(nèi)存一鍵清理:需要將應(yīng)用加入【白名單】列表伤锚,否則系統(tǒng)自帶的“一鍵加速”,會殺掉進(jìn)程
    • 自啟動管理:需要將應(yīng)用加入“i管家”中的【自啟動管理】列表志衣,否則重啟手機(jī)后進(jìn)程不會自啟屯援。但強(qiáng)制手動殺進(jìn)程,即使加了這個列表中念脯,后續(xù)進(jìn)程也無法自啟動狞洋。
  • OPPO【ColorOS】

    • 凍結(jié)應(yīng)用管理:需要將應(yīng)用加入純凈后臺,否則鎖屏狀態(tài)下無法及時收到消息
    • 自啟動管理:將應(yīng)用加入【自啟動管理】列表的同時绿店,還需要到設(shè)置-應(yīng)用程序-正在運(yùn)行里鎖定應(yīng)用進(jìn)程吉懊,否則殺進(jìn)程或者開機(jī)后進(jìn)程不會開啟庐橙,只能手動開啟應(yīng)用
  • 三星

    • 內(nèi)存一鍵優(yōu)化:需要將應(yīng)用加入【白名單】列表,否則系統(tǒng)內(nèi)存優(yōu)化后借嗽,會殺掉應(yīng)用進(jìn)程

設(shè)置方式引自極光推送文檔态鳖,侵刪


對應(yīng)設(shè)置后,華為榮耀7恶导,P9浆竭,?三星等均能接收離線消息。

四惨寿、服務(wù)器

參見文檔

end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邦泄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子裂垦,更是在濱河造成了極大的恐慌顺囊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缸废,死亡現(xiàn)場離奇詭異包蓝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)企量,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門测萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人届巩,你說我怎么就攤上這事硅瞧。” “怎么了恕汇?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵腕唧,是天一觀的道長。 經(jīng)常有香客問我瘾英,道長枣接,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任缺谴,我火速辦了婚禮但惶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湿蛔。我一直安慰自己膀曾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布阳啥。 她就那樣靜靜地躺著添谊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪察迟。 梳的紋絲不亂的頭發(fā)上斩狱,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天耳高,我揣著相機(jī)與錄音,去河邊找鬼喊废。 笑死祝高,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的污筷。 我是一名探鬼主播工闺,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瓣蛀!你這毒婦竟也來了陆蟆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤惋增,失蹤者是張志新(化名)和其女友劉穎叠殷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诈皿,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡林束,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了稽亏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壶冒。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖截歉,靈堂內(nèi)的尸體忽然破棺而出胖腾,到底是詐尸還是另有隱情,我是刑警寧澤瘪松,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布咸作,位于F島的核電站,受9級特大地震影響宵睦,放射性物質(zhì)發(fā)生泄漏记罚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一壳嚎、第九天 我趴在偏房一處隱蔽的房頂上張望桐智。 院中可真熱鬧,春花似錦诬辈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至样屠,卻和暖如春穿撮,著一層夾襖步出監(jiān)牢的瞬間缺脉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工悦穿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攻礼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓栗柒,卻偏偏與公主長得像礁扮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞬沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容