作爲google 官方的推送,相比也是很多app離不開的功能,而且會經常用到的,這裏總結一下如何集成FCM 以及後面探索一下相關原理。
說明:對於任何google service(統計,推送,廣告等等 谷歌服務) 來說,他們都依賴於手機裏面的google服務框架這個系統級別的app,同時會依賴 google-services 庫,這些東西都會在工程裏面去配置,另外,現在所有的服務都集成到firebase這個平臺了,所以也要去集成firebase庫,這是google 提供給開發者一個對外統一操作者平臺,裏面可以進行新建工程和配置。
因此,這樣來說集成任何一個google服務,都需要分兩步走,
- 第一步集成google service服務,添加firebase到工程中, 參考文章
- 集成想要的具體服務,並使用相應的api
第一步:集成firebase ,可以參考 集成Antatly ;
第二步:集成Message:官方網站
1 . 登錄網站 ,找到Cloud Message ,選擇自己的平臺android(或iOS) 如下圖:
2. 添加Message的依賴:
compile 'com.google.firebase:firebase-core:11.0.4'
compile 'com.google.firebase:firebase-analytics:11.0.4'
compile 'com.google.firebase:firebase-messaging:11.0.4'
注意:具體的某個服務 如:Message 要和 core 版本號要一致;
3. 獲取Token ,完成註冊
您的應用初次啓動時,FCM SDK 會爲客戶端應用實例生成一個註冊令牌。如果您希望定位單一設備或創建設備組,則需要通過擴展 FirebaseMessagingService
並重寫 onNewToken
來獲取此令牌。
本部分介紹如何檢索令牌以及如何監控令牌的變更。因爲令牌會在初始啓動後輪替,所以我們強烈建議您檢索最近更新的註冊令牌。
註冊令牌可能會在發生下列情況時更改:
- 應用刪除實例 ID
- 應用在新設備上恢復
- 用戶卸載/重新安裝應用
- 用戶清除應用數據。
檢索當前註冊令牌
如果需要檢索當前令牌,請調用 FirebaseInstanceId.getInstance().getInstanceId()
:
FirebaseInstanceId.getInstance().getInstanceId()
.addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
@Override
public void onComplete(@NonNull Task<InstanceIdResult> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "getInstanceId failed", task.getException());
return;
}
// Get new Instance ID token
String token = task.getResult().getToken();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
這是 官網提供的api 16的代碼,不同的版本代碼不一樣,但這一步都是獲取 registerId 註冊令牌,如 11.0.4 版本的獲取方式就是
String id = FirebaseInstanceId.getInstance().getToken();
另外,這一步手機需要翻牆,否則獲取不到,後面就不用翻牆了。
監控令牌的生成
每當生成新令牌時,都會觸發 onNewToken
回調函數, 所以在FirebaseMessageService 重寫這個類。
注意:有的版本可能沒有這些方法,因爲這是針對16的版本,所以知道有這麼回事就行了,還有app的重啓令牌不會重新生成,當我們在設置界面把app數據清空就會生成一個新的令牌,這其中的原理後面研究一下?
4. 接收消息
自己新建一個service 集成 FirebaseMessageService ,重寫 onMessageReceiver 即可。並在mainfest進行註冊一下;
public class ReceivePushMsgService extends FirebaseMessagingService {
private static final String TAG = "ReceivePushMsgService";
@Override
public void onMessageReceived(RemoteMessage 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());
// if (/* Check if data needs to be processed by long running job */ true) {
// // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
// scheduleJob();
// } else {
// // Handle message within 10 seconds
// handleNow();
// }
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
}
以上 1,2, 3, 4 步就是全部的集成步驟。
利用Firebase平臺進行測試
輸入消息信息,並通過FCM令牌進行精準推送
最後點擊發送,然後再日誌輸出:
04-11 16:32:06.020 11617-11967/com.sjh.firebasedemo D/ReceivePushMsgService: Message Notification Body: 測試推送
04-11 16:32:26.515 11617-11989/com.sjh.firebasedemo D/ReceivePushMsgService: onMessageReceived: {}
onMessageReceived: com.google.firebase.messaging.RemoteMessage@6567653
04-11 16:32:26.516 11617-11989/com.sjh.firebasedemo D/ReceivePushMsgService: From: 92864427547
Message Notification Body: 測試推送
ok ,一切完工。另外,還有其他的定位用戶的方法,通過Topic,分組等方式,這些就不一一講述了。