各位如果沒有關APP通知的時候,有時候我們就會收到來自APP的關懷,譬如說是有優惠活動,或是您的吳柏毅預計XX分內到達,這些都是我們在由後端發送訊息,然後我們在Service的時候拿到消息。
首先我們一樣要到Tools→Firebase→Clound Messaging,來新增我們的
implementation 'com.google.firebase:firebase-messaging-ktx:22.0.0'
它這邊只有讓我們的override兩個funtion,而且也不用手動去設定startService(),它會自己幫我們啟動。
class MyFirebaseMessagingService: FirebaseMessagingService(){
override fun onNewToken(p0: String) {
Timber.d("onNewToken $p0")
super.onNewToken(p0)
}
override fun onMessageReceived(p0: RemoteMessage) {
if (p0.notification != null){
Timber.d("訊息是title = ${p0.notification!!.title}")
Timber.d("訊息是body = ${p0.notification!!.body }")
}
super.onMessageReceived(p0)
}
}
★我們可以先記起來token,等等讓我們可以從Firebase平台來做發送,但是如果你今天沒有在第一次的時候Log出來,那麼你可以透過以下來再次拿到token
FirebaseMessaging.getInstance().token.addOnSuccessListener {
Timber.d("messaging token: $it")
}.addOnFailureListener {
Timber.d("messaging token fail")
}
★ 由於要發送訊息給某終端機時,需要有該終端機的Token,所以這些使用者的Token請要妥善管理。
並且我們需要在Manifest新增以下
<service android:name=".utils.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
原本想說如果在每個user寄message的時候,我們就寄寄通知,因為這樣就可以拿到該user的data,也感覺很方便,但是後來發覺怪怪的,因為通知應該不是會由每個user發,而是由第三方監測到數據更改,然後再發送給使用者的吧?? 好的,於是乎,我們改成做出發送廣告 ><
而FCM有提供兩種
Firebase Cloud Messaging 提供了兩種將消息定位到多個設備的方法:
我們這次主要是透過主題的方式
而主題註冊的方式也很簡單,我們在 MyApp新增以下
private fun subscribeToTopic(){
//subcribeToTopic裡面的參數就填寫主題
Firebase.messaging.subscribeToTopic("advertisement")
.addOnCompleteListener { task ->
if (!task.isSuccessful){
Timber.d("訂閱不成功")
}else{
Timber.d("訂閱成功")
}
}
}
接下來,我們直接去Firebase的平台→自己的專案→Clound Messaging 來測試
按照它的規格寫就好
你可以選擇使用者區隔,裡面會有一些版本/國家等等的區隔,或是我們這次要用的主題,我們在訊息主題直接新增剛剛我們在專案訂閱的關鍵字 "advertisement"
然後回到1通知後,我們用傳送測試訊息,接下來要把剛剛得到的token傳進去,之後選擇後按測試,就可以啦!!