google FireBase產品接入 —— FCM

作爲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,分組等方式,這些就不一一講述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章