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)用
.
選擇添加到安卓應(yīng)用
.
下載生成的文件名為 “google-services.json”的文件,放在應(yīng)用級別的文件目錄下
.
期間有個添加包名和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
.
.
應(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.
.
題外話
如果同時也引入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ā))
.
發(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