FlutterでFCMを使うと通知バッジが削除されてしまう

公開:2020/09/25
更新:2020/09/25
2 min読了の目安(約1700字TECH技術記事

はじめに

FlutterとFirebaseでアプリを作るとき、メッセージを通知したいときfirebase_messagingを使うと思います。

このパッケージを使うとfirebaseから通知を受信して、アプリアイコンに通知数を表すバッジが表示されますが、デフォルトでアプリ起動時に通知バッジを削除してしまいます。

しかし、メールアプリやTwitterのように、アプリ起動タイミングでバッジを削除するのではなく、未読のメッセージを開いたときに通知バッヂがデクリメントしていくという挙動にしたいときがあります。

以下には、firebase_messagingで起動タイミングで通知バッジを削除しないように設定する方法について説明していきます。

この記事は以下のバージョンを想定しています。

  • flutter: 1.20.4
  • firebase_messaging: 7.0.0

解決方法

取り上げた問題については、GithubでIssueが作成されていました。

今回、私が解決した方法もIssueを真似ただけなので、英語が得意な方はこちらを読んでください。

改めて、解決方法を書きますと、

まずは、Flutterアプリのプロジェクトルートのiosディレクトリ以下にあるFLTFirebaseMessagingPlugin.mを開く。

※私の環境の場合はFLTFirebaseMessagingPlugin.mまでのパスは以下です。

ios/.symlinks/plugins/firebase_messaging/ios/Classes/FLTFirebaseMessagingPlugin.m

次に、application.applicationIconBadgeNumberと書かれている行まで移動します。
ちなみに私の環境では245行目にありました。

・・・

- (void)applicationDidBecomeActive:(UIApplication *)application {
  _resumingFromBackground = NO;
  // Removes badge number but doesn't clear push notifications,
  // helpful when you have valuable info in your push notification
  application.applicationIconBadgeNumber = 0;
}

・・・

詳しい挙動はわからないですが、applicationDidBecomeActiveと書かれているので、アプリ起動タイミングでブロックの中の処理が実行されることが予想できます。

ブロック中のapplication.applicationIconBadgeNumberと書いてあるところでアプリアイコンのバッジを設定しているようです。
なぜ、2つ存在するのか疑問ですがこのプロパティに0を代入しているためバッジが削除しているように思います。

よって、アプリ起動時にバッジを削除する処理を回避するため次の行をコメントアウトしましょう。

// application.applicationIconBadgeNumber = 0;

ちなみに、変更した内容はgitで管理されないファイルを変更したのでパッケージをアップデートしたり、githubからcloneすると再設定が必要になる場合があります。

通知バッジを削除したいときはflutter_app_badgerを用いれば、好きなタイミングで通知を削除できると思います。