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)步驟如下:
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 API initialization failure.
- Android app not receiving Firebase Notification when app is stopped from multi-task tray
- Push notification works incorrectly when app is on background or not running
- Push not received when app is killed
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>