はじめに
- 私が開発に携わっているFlutter製のアプリで、FCMから送られてくるサイレントプッシュを受け取り、それをきっかけにアプリ上でバックグラウンド処理をかけたく、可能かどうかの調査を行った。
- この記事は、2024年9月27日段階で、調査し分かったことをまとめたものになります。
onBackgroundMessageについて
- Flutterでバックグラウンドメッセージ処理するには、FCMから提供されている
onBackgroundMessage
を使う必要がある。 -
onBackgroundMessage
を使用する時には、トップ関数にしないといけない、ハンドラに@pragma('vm:entry-point')
アノテーションを付ける必要がある、など注意点が何個かある。 - また、バックグラウンドでは、アプリの状態を更新したり、UIに影響するようなロジックは実行できなく、ローカルストレージの更新などは可能とドキュメントに書かれていたため、今回は
SharedPreferences
にデータが保存されるかどうかをAndroid・iOSで検証した。
詳細: https://firebase.google.com/docs/cloud-messaging/flutter/receive?hl=ja#background_messages
結論
- FCMの
onBackgroundMessage
は、androidでは機能する、iOSではOSの問題で機能しない。 - そしてそれを解決する方法は現状明らかにされていない。
原因
- iOSで
onBackgroundMessage
が機能しない問題は、iOSのバックグラウンド処理の制限にある。 - iOSは、バッテリー寿命を延ばすために、バックグラウンドでのアプリの動作を厳しく制限しているらしく、特にバックグラウンドでネットワーク通信やCPUの使用は厳しく制限されている。
- これにより、FCMからサイレント通知を送っていたとしても、iOSのバックグラウンドで受け取ることが困難になっている。
試したこと
- GitHub上では、開発者が様々な議論を繰り広げており、
'content-available'=> 1
や'apns-push-type' => 'background'
、'apns-priority' => '5'
等をペイロードに含めると機能するようになるという話が挙がっており、何パターンか試してみたがダメだった。
https://github.com/firebase/flutterfire/issues/6290
https://github.com/firebase/flutterfire/issues/9381 など - また、シミュレータと実機、どちらで試してみても変わらなかった。
ドキュメントにできると書かれているのに、できないとなるとがっかりしますね...。
しかし今後、解決手法が見つかる可能性もありますので、最新の情報をチェックしていく必要があります。
以上、2024年9月27日現段階で調査し分かったことのまとめになります。
ご覧いただきありがとうございました。