因為產(chǎn)品需要,接入Firebase Cloud Messaging實現(xiàn)消息通知垛叨,接入的時候踩了一些坑這里記錄一下伦糯。
-
最開始跟著Firebase教程在build.gradle引入
implementation 'com.google.firebase:firebase-messaging:23.1.0'
編譯報錯,引入的庫出現(xiàn)類沖突:
Duplicate class com.google.firebase.iid.FirebaseInstanceIdReceiver found in modules jetified-firebase-iid-19.0.0-runtime (com.google.firebase:firebase-iid:19.0.0) and jetified-firebase-messaging-23.1.0-runtime (com.google.firebase:firebase-messaging:23.1.0)
com.google.firebase:firebase-messaging:23.1.0和com.google.firebase:firebase-iid:19.0.0庫里面都有一個FirebaseInstanceIdReceiver類点额,但是繼承的基類不一致舔株,所以不能通過exclude group:移除。隨后嘗試降低版本到com.google.firebase:firebase-messaging:21.1.0还棱,編譯通過载慈。
然后更新com.google.firebase:firebase-analytics-ktx:21.0.0庫版本到21.2.0,編譯出現(xiàn)問題:
C:/Users/Admin/.gradle/caches/transforms-3/719f46791576794f028e9d76950ddae9/transformed/jetified-kotlin-stdlib-common-1.7.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.5.1.
經(jīng)過一番百度珍手,最后更新kotlin-gradle-plugin版本號為:1.6.0
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
編譯通過办铡。
-
隨后,測試的時候發(fā)現(xiàn)琳要,在Android 12出現(xiàn)了新的問題寡具,F(xiàn)irebase在控制臺發(fā)送測試設(shè)備的消息通知之后,點擊通知欄的消息無法進(jìn)入App稚补,很奇怪童叠。此時如果進(jìn)入App需要重新啟動,也就是該進(jìn)程被殺掉了课幕,猜測是點擊消息通知的時候出現(xiàn)了Crash厦坛。在Android 11以及以下是正常的,另外如果App切到后臺乍惊,然后等待接收到通知杜秸,此時切換到前臺,再下拉通知欄润绎,點擊該App的通知撬碟,那么可以正常從App啟動頁進(jìn)入。隨后調(diào)試發(fā)現(xiàn)莉撇,
NotificationService: Indirect notification activity start (trampoline) from com.xxx.xxxx.xxx blocked
經(jīng)過一番搜索之后發(fā)現(xiàn)呢蛤,從Android 12開始,禁用了點擊通知先打開Service/BroadCast棍郎,在從里面啟動Activity這種方式顾稀,必須是直接啟動Activity。猜測com.google.firebase:firebase-messaging:21.1.0版本就是用這種方式實現(xiàn)的消息通知坝撑。那么又只能回到問題1静秆,繼續(xù)解決問題1粮揉。
-
嘗試用其它方式引入firebase-messaging
implementation platform('com.google.firebase:firebase-bom:31.1.0') implementation 'com.google.firebase:firebase-messaging'
編譯依然是類沖突。最后嘗試指定com.google.firebase:firebase-iid:19.0.0的版本抚笔,引入最新版
implementation 'com.google.firebase:firebase-iid:21.1.0'
編譯通過扶认。
繼續(xù)發(fā)送測試消息通知,嘗試用Android 12機(jī)器從通知欄的消息點擊進(jìn)入殊橙,可以進(jìn)入App辐宾,達(dá)到預(yù)期效果,問題解決膨蛮。
常見問題
-
按照教程接入Firebase Cloud Messaging了叠纹,但是無消息通知
- 請檢查網(wǎng)絡(luò)是否能訪問外網(wǎng)
- 檢查測試設(shè)備的FCM注冊令牌是否正確,App卸載重新安裝之后會更新令牌
- 檢查機(jī)器是否有Google Play
-
App在前臺不能接收到消息提示
沒有消息提示敞葛,但是會回調(diào)FirebaseMessagingService的onMessageReceived方法誉察,重寫自行實現(xiàn)通知即可。
private void createNotification(RemoteMessage remoteMessage) { Intent intent = new Intent(this, NotificationActivity.class); intent.putExtra("text", remoteMessage.getData().get("message_data_text")); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, createChannel()) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(remoteMessage.getData().get("message_data_title")) .setContentText(remoteMessage.getData().get("message_data_text")) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, notificationBuilder.build()); }
-
App殺掉進(jìn)程之后不能接收到通知
檢查App是否有自啟動的權(quán)限惹谐,是否加入電池優(yōu)化了持偏。
-
點擊消息通知進(jìn)入App的方式怎么拿到傳遞的參數(shù)?
在啟動頁的onCreate從Intent中獲取氨肌,
Intent intent = getIntent(); if(intent.getExtras() != null && intent.getExtras().containsKey("key")) { String data = intent.getExtras().getString("key")); }