1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(Flutter) FCMのonBackgroundMessageがiOSでは機能しない

Last updated at Posted at 2024-09-27

はじめに

  • 私が開発に携わっている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のバックグラウンドで受け取ることが困難になっている。

参考: https://perfectflutter.com/339/flutter%E3%81%A8ios%EF%BC%9Aonbackgroundmessage%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%81%AE%E8%A7%A3%E6%B1%BA%E7%AD%96/

試したこと

  • 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日現段階で調査し分かったことのまとめになります。

ご覧いただきありがとうございました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?