一、Firebase Cloud Messaging簡介
參考文檔:https://firebase.google.com/docs/cloud-messaging/
1、引入
說起Firebase Cloud Messaging(簡稱FCM),可能多數人都不知道,但是說起GCM(Google Cloud Messaging)想必安卓開發人員都瞭解,雖然目前國內的安卓設備都閹割了谷歌服務導致GCM並不能正常使用,但是GCM的知名度還是有的。
2、工作原理
即使關閉了蘋果手機的軟件,手機依然可以收到軟件推送的消息,原因就是該消息是從軟件的服務器經由蘋果的服務器轉發到蘋果手機上的,而GCM的作用跟該蘋果的推送原理類似,軟件服務器將消息交給谷歌服務器,谷歌的服務器將消息推送到安卓設備上,可以極大的減少無用軟件的喚醒,降低手機耗電量。
3、現狀
由於谷歌在國內被屏蔽訪問,國內的大部分手機都閹割了谷歌服務,這就導致了GCM不可用,各大廠商都想方設法保持自己的軟件在安卓設備上處於活動狀態,便於及時將各種消息推送到安卓設備上,導致人們對安卓的印象就是卡頓和耗電,這跟GCM的不可用有極大關係。
由於公司業務需要,要做國外運營的軟件,所以就需要接入GCM,上谷歌查詢文檔,發現官方已經不再推薦開發者使用GCM了,而推薦更為強大的FCM,可以認為FCM是GCM的改進版或者加強版。
二、接入準備工作
1、開發設備
裝有谷歌服務器的安卓手機一臺
2、開發環境
Android Studio
3、控制檯設置
(1)、創建應用
打開Firebase控制檯:https://console.firebase.google.com/
點擊新建項目
(2)、填寫項目名稱
在彈出的窗口填寫項目名稱,然後點擊創建項目
(3)、集成Firebase到安卓
在Overview選項中點擊將Firebase添加到您的Android應用
(4)、填寫包名和sha1
在彈出的窗口中輸入項目的包名和sha1,然後點擊添加應用
(5)、下載google-services.json
創建成功後點擊Download google-services.json,然後將項目切換到Project視圖,將下載的文件放入到app的根目錄
PS:切記,添加的sha1如果是debug版,那麼正式版的sha1也需要添加進去。點擊Overview後面的設置按鈕,再選擇項目設置,找到常規選項卡,在下方繼續添加sha1即可,保存後記得重新下載google-services.json並放到app的根目錄中
三、Android端集成FCM
參考文檔:https://firebase.google.com/docs/cloud-messaging/android/client
1、修改gradle文件
(1)、項目級build.gradle
在項目級的build.gradle文件中的dependencies節點中添加下面代碼
<code>classpath 'com.google.gms:google-services:3.0.0'/<code>
(2)、應用級build.gradle
在應用級的build.gradle文件中添加依賴
<code>compile 'com.google.firebase:firebase-messaging:10.0.2'/<code>
將下面的代碼放到文件的最後一行
<code>apply plugin: 'com.google.gms.google-services'/<code>
2、創建MyFirebaseInstanceIDService
在項目中新建MyFirebaseInstanceIDService,繼承FirebaseInstanceIdService,並重寫下面的方法
<code>@Override
public void onTokenRefresh() {
super.onTokenRefresh();
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}/<code>
在清單文件中註冊Service
<code><service>
<intent-filter>
<action>
/<intent-filter>
/<service>/<code>
3、MyFirebaseMessagingService
新建MyFirebaseMessagingService,繼承FirebaseMessagingService,重寫下面方法
<code>@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());
}
}/<code>
在清單文件中註冊
<code><service> android:name=".MyFirebaseMessagingService">
<intent-filter>
<action>
/<intent-filter>
/<service>/<code>
4、獲取token
在項目中,可以通過下面代碼獲取設備的token,並將token發送到服務器,便於服務器進行指定設備的消息推送
<code>FirebaseInstanceId.getInstance().getToken();/<code>
5、設置圖標和背景色
在清單文件中添加下面代碼,可以分別設置通知的圖標和圖標的背景色
<code> android:resource="@drawable/icon_logo" />
android:resource="@color/colorPrimary" />/<meta-data>/<meta-data>/<code>
四、發送消息
1、控制檯發送消息
在控制檯左側選擇Notifications,然後點擊寫新消息,就可以向指定設備或全部設備發送消息了
2、通過發送post請求發送消息
(1)、請求地址
請求的地址為:https://fcm.googleapis.com/fcm/send
(2)、請求頭部
http頭部必須包含兩部分Content-Type:application/jsonAuthorization:key=YOUR_SERVER_KEY其中serverkey可以在控制檯的設置--項目設置--雲消息傳遞--服務器密鑰中獲取
(3)、發送內容
如果發送通知消息,則發送的內容類似與下面的代碼
<code>{ "notification": {
"title": "Portugal vs. Denmark",
"text": "5 to 1"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}/<code>
其中to的值是設備的token
更多參數設置可以參考:https://firebase.google.com/docs/cloud-messaging/concept-options?hl=zh-cn#notifications
閱讀更多 掘墓人的小鏟子 的文章