背景
Flutter1.xでアプリを開発しました。
運営でAndroid12を対応しないといけないため、色々苦労しました。
Firebase Clound Messaging(FCM)の対応は一番しんどいでした。
Android12ではServiceに対して、exportしないといけない
export対応
FCMのServiceはFirebaseMessagingServiceなので、export=false
かと思います。
そして、この後はビルド成功し、特に問題なかった。
リリース審査出す直前、まさかの通知不通のテスト結果出て、exportの影響だなぁと思いきや、他の問題でした。
問題
前提:
FCMの20.0.0を使用しています。
現象:
Android12のセキュリティ対応によって、こんなエラー出ていました。
Targeting S+ (version 10000 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
しかも、直接crash、やばいですね。
ログを追った結果。
android.app.PendingIntent.checkFlags(PendingIntent.java:375) at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645) at android.app.PendingIntent.getBroadcast(PendingIntent.java:632) at
com.google.firebase.a
com.google.firebase.b
com.google.firebase.FirebaseMessagingService
com.google.firebase.h
com.google.firebase.g
結論:
firebase悪いのだ。
中にPendingIntentする時が、FlagはFLAG_MUTABLEして、onMessageReceived
を呼べなくなっている、ってか、crashしていた。
対応
firebase悪いので、firebaseのバージョンを上がるしかない(下がるのはないでしょ、Android12だぞ、最新だぞ)。
最後はcom.google.firebase:firebase-messaging:21.1.0
で安定しました。
firebaseのandroid sdk仕様は近年すごく変更して、まとめにならないですね。
確かに、firebase-coreからfirebase-バラバラになっている。
しかも、バージョンはバラバラのリリースの番号になっています、開発者として管理難しいと思いますが。
みんな様どう思うでしょう。
最後
本文書く目的として、
自分は今日FCMに関して、一個一個試して、結果を探すしかないなので、
時間のロスしないように、共有いたしました。
みんな様のAndroid12対応の道に役に立つ様に祈ります。