Firebase Messaging
FCM (console:https://console.firebase.google.com/ )
註冊接收端
新增專案
- 專案名(無限制)
新增應用程式
- Android 套件名稱
- 選取APP 的 package name
- 註冊
- Android 套件名稱
下載設定檔 google.services.json
- 下載後貼到專案目錄的 /app 目錄下面
新增 Firebase SDK
開啟 Android studio
build.gradle(Project:PackageName)
1
2
3
4
5buildscript {
dependencies {
// Add this line
classpath 'com.google.gms:google-services:xxx
}build.gradle(Module:app)
1
2
3
4
5
6
7dependencies {
// Add this line
implementation 'com.google.firebase:firebase-messaging:xxx'
}
...
// Add to the bottom of the file
apply plugin: 'com.google.gms.google-services'
建立 FCM Service
- 建立 extends FirebaseMessagingService 的 class
- @Override
- onNewToken
1.取得 Token - onMessageReceived
- 收取訊息
- RemoteMessage是接收從FCM傳送過來的類別
- rm.getNotification
- 取得 Notification 格式資料
- 有 title & body
- 取得 Notification 格式資料
- rm.getData
- 取得自定義資料 class = Map<String,String>
- rm.getNotification
- onNewToken
- @Override
- 建立 extends FirebaseMessagingService 的 class
1 | class FCMService: FirebaseMessagingService() { |
- MainActivity
- FirebaseApp.initializeApp(MainActivity.this);
- 啟動 FCM
- FirebaseInstanceId.getInstance()
- 取得 在這個APP FCM 物件
- getInstanceId()
- 取得 registerID
- 必須設定
- addOnSuccessListener
- OnSuccessListener
() - Override
- onSuccess
- Override
- OnSuccessListener
- addOnFailureListener
- 取得 registerID 失敗偵測
- OnFailureListener
- Override
- onFailure
- Override
- addOnSuccessListener
- FirebaseApp.initializeApp(MainActivity.this);
1 | FirebaseApp.initializeApp(this) |
- AndroidManifest.xml
- 設定 service
1 | <service android:name=".FCMTest"> |
- NOTE!!!!
- 因 android SDK 變化, Firebase SDK 版本也需要配合改變,否則會無法 Sync
- 建議直接讓系統自己把 SDK版本裝好
- Tools -> Firebase
- clound messaging
- Set up Firebase Cloud Messaging
- Connnect your app to Firebase (step 1-3 設定)
- Add FCM to your app
- 按鈕按下去設定好 SDK
- Handle messages (step 4-6 設定)
發送 REST API
- 有舊版 legacy HTTP & 新版 HTTP v1
- legacy HTTP 介紹
- url
- token - 放在 header
Authorization: key= 在 FCM console 專案設定 > Cloud Messaging 的伺服器金鑰
- 傳送格式 - 放在 body payload data Content-Type=application/json
1
2
3
4
5
6
7
8
9
10{
"to": "/topics/news",
"notification": {
"title": "Breaking News",
"body": "New news story available."
},
"data": {
"story_id": "story_12345"
}
}- to - 要傳遞訊息到哪
- 個人- 每個裝置註冊時會有
裝置的token
,可用來傳遞訊息 - topic - 主題式群體傳送
- 個人- 每個裝置註冊時會有
- notification - 通知
- 用這個傳送,裝置會自動顯示 notification,不會用自定 notification 的格式
- 格式固定 title & body
- data - 自定資料格式
- to - 要傳遞訊息到哪
- url
- 新版 HTTP v1
- url
POST https://fcm.googleapis.com/v1/projects/[project-name]/messages:send
- token - 放在 header
Authorization: Bearer <valid Oauth 2.0 token>
token 要額外申請
- url
- legacy HTTP 介紹
Question
- 關於 NotRegistered
- 原因:
- 註冊好的 registerID 到期
- 解析發生次類狀況的原因:
- APP 刪除
- 清過 APP 資料
- token 到期(網路說是4個月)
- App 自己刪除 Instance ID
P.S. 會有用 Http protocol reference 去執行推送
- 原因:
P.S. 也可以用 FCM console https://console.firebase.google.com/ 去做設定