一、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節點中添加下面代碼
(2)、應用級build.gradle
在應用級的build.gradle檔案中添加依賴
将下面的代碼放到檔案的最後一行
2、建立MyFirebaseInstanceIDService
在項目中建立MyFirebaseInstanceIDService,繼承FirebaseInstanceIdService,并重寫下面的方法
@Override
public void onTokenRefresh() {
super.onTokenRefresh();
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
在清單檔案中注冊Service
<service android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
3、MyFirebaseMessagingService
建立MyFirebaseMessagingService,繼承FirebaseMessagingService,重寫下面方法
@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() > ) {
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());
}
}
在清單檔案中注冊
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
4、擷取token
在項目中,可以通過下面代碼擷取裝置的token,并将token發送到伺服器,便于伺服器進行指定裝置的消息推送
FirebaseInstanceId.getInstance().getToken();
5、設定圖示和背景色
在清單檔案中添加下面代碼,可以分别設定通知的圖示和圖示的背景色
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/icon_logo" />
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorPrimary" />
四、發送消息
1、控制台發送消息
在控制台左側選擇Notifications,然後點選寫新消息,就可以向指定裝置或全部裝置發送消息了
2、通過發送post請求發送消息
(1)、請求位址
請求的位址為:https://fcm.googleapis.com/fcm/send
(2)、請求頭部
http頭部必須包含兩部分
Content-Type:application/json
Authorization:key=YOUR_SERVER_KEY
其中serverkey可以在控制台的設定–項目設定–雲消息傳遞–伺服器密鑰中擷取
(3)、發送内容
如果發送通知消息,則發送的内容類似與下面的代碼
{ "notification": {
"title": "Portugal vs. Denmark",
"text": "5 to 1"
},
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
其中to的值是裝置的token
更多參數設定可以參考:https://firebase.google.com/docs/cloud-messaging/concept-options?hl=zh-cn#notifications