FCM開發(fā)總結(jié)

Android端

先決條件

  • 一臺(tái)運(yùn)行 Android 2.3 (Gingerbread) 或更新版本并運(yùn)行 Google Play 服務(wù) 9.6.1 或更新版本的設(shè)備晋被。

  • SDK Manager需要下載Google play Services SDK

  • Android Studio 1.5 或更高版本

  • Android Studio 項(xiàng)目及其捆綁包名稱胞谭。

    2.2 之前的 Android Studio 版本中的 Instant Run 與 Firebase Analytics 不兼容疾捍,并且會(huì)阻止其收集某些事件。建議禁用 Instant Run 或升級(jí)到 Android Studio 2.2 +

將Firebase添加至Android項(xiàng)目

  • 首先峻呛,要在Firebase console中創(chuàng)建一個(gè)Firebase項(xiàng)目罗售。如果已經(jīng)有一個(gè)與您的移動(dòng)應(yīng)用關(guān)聯(lián)的現(xiàn)有 Google 項(xiàng)目辜窑,請(qǐng)點(diǎn)擊 Import Google Project。 否則寨躁,請(qǐng)點(diǎn)擊 Create New Project穆碎。
  • 點(diǎn)擊 Add Firebase to your Android app 并按設(shè)置步驟進(jìn)行操作。如果在導(dǎo)入現(xiàn)有 Google 項(xiàng)目职恳,這可能是自動(dòng)進(jìn)行的所禀,您只需下載配置文件即可。
  • 按照提示輸入應(yīng)用的包名稱放钦。包名稱很重要色徘,不要填錯(cuò)
  • 最后操禀,下載google-services.json 文件贺氓,然后copy到app目錄下

添加SDK

首先在根級(jí)別的build.gradle文件添加一條規(guī)則。以包含Google服務(wù)插件

   // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:3.0.0'
    }

然后在模塊Gradle文件中床蜘,底部添加apply plugin行,以啟用 Gradle 插件:

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  compile 'com.google.firebase:firebase-core:9.6.1'
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

然后根據(jù)需求添加Firebase SDK依賴項(xiàng)蔑水。上面的com.google.firebase:firebase-core:9.6.1邢锯。

上面的依賴firebase如果是從9.6.1升級(jí)到10.0.1,gcm也需要升級(jí)到10.0.1,否則會(huì)出現(xiàn)crash搀别。

Firebase功能庫完整列表:

Gradle 依賴項(xiàng)行 服務(wù)
com.google.firebase:firebase-core:9.6.1 Analytics
com.google.firebase:firebase-messaging:9.6.1 Cloud Messaging / Notifications
... ...

在Android studio 2.2+丹擎,上面的步驟可以用Tools->Firebase,然后根據(jù)提示實(shí)現(xiàn)集成。

設(shè)置FCM客戶端

  • 自定義MyFirebaseMessagingService繼承FirebaseMessagingService,重寫onMessageReceived方法接收通知消息彈通知欄歇父,F(xiàn)CM有兩種消息蒂培,data message和 notification message,notification只有在后臺(tái)的時(shí)候才會(huì)走這個(gè)方法,data message不管在后臺(tái)還是前臺(tái)都會(huì)走這個(gè)方法榜苫。
  • 自定義MyFirebaseInstanceIDService 集成 FirebaseInstanceIdService用戶token的創(chuàng)建护戳,轉(zhuǎn)換和更新,在onTokenRefresh()方法中獲取token并上傳到服務(wù)器垂睬。
  • 獲取token:
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "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);
  • 在AndroidManifest文件中配置:
    <!-- [START firebase_service] -->
    <service
        android:name="packagename.MyFirebaseMessagingService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <!-- [END firebase_service] -->
    <!-- [START firebase_iid_service] -->
    <service
        android:name="packageName.MyFirebaseInstanceIDService"
        android:stopWithTask="false">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    <!-- [END firebase_iid_service] -->

Server端

Server端實(shí)現(xiàn)步驟如下:

  1. 將Firebase添加至服務(wù)器

  2. 實(shí)現(xiàn)連接服務(wù)器協(xié)議

  3. 發(fā)送下游消息(云端至設(shè)備)

FCM有三種消息類型媳荒,分別為Notification message,Data Message,Messages with both notification and data payload

  • Notification Message 通知消息,當(dāng)App在前臺(tái)的時(shí)候會(huì)走到我們自定義的MyFirebaseMessagingService 中的 onMessageReceived方法驹饺,當(dāng)在后臺(tái)的時(shí)候由系統(tǒng)彈通知欄钳枕,當(dāng)app被殺死的時(shí)候,從Firebase后臺(tái)發(fā)送是收不到的赏壹。對(duì)應(yīng)的HTTP POST請(qǐng)求:
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key= App Key
{
    "notification" : {
      "body" : "You have a new message",
      "title" : "",
      "icon" : "myicon" // Here you can put your app icon name
    },
    "to" : "token..."
}

  • Data Message 只有當(dāng)App在前臺(tái)或者在后臺(tái)的時(shí)候鱼炒,才會(huì)走到MyFirebaseMessagingService中的onMessageReceived方法,當(dāng)App被殺死當(dāng)情況下會(huì)不會(huì)走到這里蝌借,需要測(cè)試昔瞧。HTTP POST請(qǐng)求:
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key= App Key
{
    "data" : {
      "Nick" : "Obito",
      "xxx" : "xxx"
    },
    "to" : "token..."
}

  • Messages with both notification and data payload這種消息是在Notification Message的基礎(chǔ)上加入一些數(shù)據(jù)指蚁,在用戶點(diǎn)擊通知欄的時(shí)候啟動(dòng)對(duì)應(yīng)的activity并傳入intent。HTTP POST請(qǐng)求:
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=App Key

{   
    "notification" : {
      "body" : "You have a new message",
      "title" : "",
      "icon" : "myicon" // Here you can put your app icon name
      "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
    }, 
    "data": {
    "Nick" : "Obito",
    "xxx" : "xxx"
  },
  "to" : "token..."
}

點(diǎn)擊的時(shí)候在OPEN_ACTIVITY_1中攔截

<intent-filter>
        <action android:name="OPEN_ACTIVITY_1" />
        <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

遇到的一些問題

Firebase控制臺(tái)測(cè)試只能發(fā)送Notification硬爆,測(cè)試的時(shí)候把App從最近列表劃掉之后能收到欣舵,而且是在沒翻墻的情況下都能收到。當(dāng)然當(dāng)進(jìn)程被完全殺死就收不到了缀磕。data Message則需要通過server api調(diào)用缘圈,前臺(tái)后臺(tái)都能收到透?jìng)飨ⅰ?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袜蚕,隨后出現(xiàn)的幾起案子糟把,更是在濱河造成了極大的恐慌,老刑警劉巖牲剃,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遣疯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凿傅,警方通過查閱死者的電腦和手機(jī)缠犀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪舒,“玉大人辨液,你說我怎么就攤上這事∠洳校” “怎么了滔迈?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長被辑。 經(jīng)常有香客問我燎悍,道長,這世上最難降的妖魔是什么盼理? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任谈山,我火速辦了婚禮,結(jié)果婚禮上宏怔,老公的妹妹穿的比我還像新娘勾哩。我一直安慰自己,他們只是感情好举哟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布思劳。 她就那樣靜靜地躺著,像睡著了一般妨猩。 火紅的嫁衣襯著肌膚如雪潜叛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音威兜,去河邊找鬼销斟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛椒舵,可吹牛的內(nèi)容都是我干的蚂踊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼笔宿,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼犁钟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泼橘,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤涝动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后炬灭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醋粟,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年重归,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了米愿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼻吮,死狀恐怖吗货,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狈网,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布笨腥,位于F島的核電站拓哺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脖母。R本人自食惡果不足惜士鸥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谆级。 院中可真熱鬧烤礁,春花似錦、人聲如沸肥照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舆绎。三九已至鲤脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猎醇。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工窥突, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硫嘶。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓阻问,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沦疾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子称近,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,412評(píng)論 2 45
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,340評(píng)論 7 249
  • 一天的訓(xùn)練在期盼中終于結(jié)束坛善,動(dòng)作雖然無法清晰的記住,但從未想過一向肢體不協(xié)調(diào)的我也學(xué)起了這種健美操和扇子舞邻眷,心...
    叮小咚閱讀 353評(píng)論 0 0
  • 陪他喝酒時(shí)眠屎,還要負(fù)責(zé)聽他講故事。他喝醉了會(huì)重復(fù)嘮叨一件事肆饶,每次講到一半時(shí)他開始哭改衩。一個(gè)三十歲的男人,哭起來竟像個(gè)孩...
    張大怪閱讀 933評(píng)論 4 11