😽

Flutter ローカル通知について(flutter_local_notifications)

2024/12/31に公開

ローカル通知について

実装でローカル通知を利用する際に気なった部分がありました。
1.バックグラウンド時の挙動
2.アプリをkillした際に通知を押下した際の挙動

記事あるかなと思ったのですがなかなか記載された記事が無かったのと、上記が気になって実務中にいろいろ試したり調べたので備忘録かきこ。

flutter_local_notifications

パッケージはこちら
https://pub.dev/packages/flutter_local_notifications

導入方法は下記記事を参考にしました。
https://zenn.dev/slowhand/articles/f2dc182c7f5dd7

1.バックグラウンドでの処理

バックグラウンド時(アプリを立ち上げたまま、端末のホーム画面にいった場合)。

await _flutterLocalNotificationsPlugin.initialize(
  initializationSettings,
  onDidReceiveNotificationResponse: _onTapForeground, // フォアグラウンド時のハンドラー
  onDidReceiveBackgroundNotificationResponse: notificationTapBackground, // バックグラウンド時のハンドラー
);

上記の様にバックグランド時のハンドラーをonDidReceiveBackgroundNotificationResponseに記載していました。

実際は、onDidReceiveNotificationResponseの関数のみで両方作動するようです。。。
実際にログを忍ばせて確認したところどっちでも作動するのを確認しました。

アプリがフォアグラウンドであろうがバックグランドあろうが、アプリをkillしない限りはonDidReceiveNotificationResponseで通知押下時の処理書けばOKでした。

気になったので両者の違いを調べました。
(間違えてたら指摘ください)

onDidReceiveNotificationResponse

フォアグラウンドおよびバックグラウンド状態でアプリが実行中の場合に、ユーザーが通知をタップした際の処理を行う。
フォアグラウンドでは、即座にダイアログなどのUI操作を実行できる。
バックグラウンドでは、アプリがフォアグラウンドに復帰し、同様に処理を行う。

onDidReceiveBackgroundNotificationResponse

アプリがバックグラウンドにある場合や完全に終了(キル)されている場合に、通知タップ時にバックグラウンドで特定の処理(例: API通信、データベースの更新など)を行いたい場合に使用。

2.アプリをkillした際の挙動

API通信等の処理しなくていいのであれば、getNotificationAppLaunchDetails()がkillした際に使えます。

参考記事
https://halzoblog.com/error-bug-diary/20220510-2/

下記が実装したコードになります。

///通知を作成
 await _flutterLocalNotificationsPlugin.show(
    id,
    title,
    body,
    notificationDetails,
    payload: payload, ///通知で渡せるデータがここに入る
  );

////// 以下略

 // アプリが通知タップで起動されたかどうかを確認
  final NotificationAppLaunchDetails? notificationAppLaunchDetails =
      await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails();

/// 通知の中にデータがあるか確認してある場合は表示
  String? initialPayload;
  if (notificationAppLaunchDetails?.didNotificationLaunchApp ?? false) {
    initialPayload =
        notificationAppLaunchDetails!.notificationResponse?.payload;
    debugPrint('アプリが通知タップで起動されました。ペイロード: $initialPayload');
  }

getNotificationAppLaunchDetails

アプリが完全に終了(キル)された状態で、通知をタップしてアプリを起動した際に、通知のペイロードを取得。
これにより、アプリ起動時にペイロードを基にログ出力ができます。

だいたいのアプリがkillした場合、ホーム画面にいくので何かさせたいならmain.dartでpayloadの中身を確認して中身があるなら、何かを表示するなり、画面遷移させるなりできるかなと思います。

今回はバックグラウンド時に複雑な処理をする必要なかったのでonDidReceiveBackgroundNotificationResponseを使わなかったですが、使い方によっては必要になるのかなと。

ただ、使わなくても結構できることあるので用途に合わせればいいかなと。

以上!!!

Discussion