flutter_local_notificationsのonSelectNotification属性が、アプリを閉じたバックグラウンド状態だと動作しない

スポンサーリンク

2022/5/10 Flutter エラー・バグ日記 

以前、こちらの日記で、「flutter_local_notifications」のパッケージを使い、通知をタップしたら特定画面を開く「onSelectNotification」属性の利用方法を書いたが、実はアプリを閉じた状態で通知をタップすると、動作しないと分かった。。。

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかは載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

「onSelectNotification」属性に設定したメソッド内に、print文を入れてチェックしたが、アプリを閉じた状態だとprint文が表示されず、「onSelectNotification」属性自体が機能しないと分かった。

 

通知はアプリを閉じた状態でタップするのが普通なので、何とか解消したい。。

 

「flutter_local_notifications」の通知の設定方法に関する解説記事は多いが、通知をタップしたときの処理に関する情報は意外と少ない。。

 

色々と調べてみると、こちらの記事で全く同じ質問がなされていることを発見。

 

 

結論としては、「getNotificationAppLaunchDetails()」メソッドで、通知のタップからアプリを起動したか否かを判別する「didNotificationLaunchApp」プロパティを取得すれば良いとのこと。 

 

確かに、パッケージ公式のExampleでも、このメソッドが使われていたが、よく分からずスルーしてしまっていた。。

 

具体的には、アプリ起動時のmain関数内に、以下のように追加することで対処できた。

 

// 注:既成ライブラリ内の名称と区別するため、自作した変数・メソッド・クラス名の末尾には「O」を付けて表記

// グローバルで「FlutterLocalNotificationsPlugin」クラスのインスタンスを定義
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPluginO = FlutterLocalNotificationsPlugin();

// アプリ起動時のmain関数
void main() async{

  // main関数内で非同期処理するときの決まり文句
  WidgetsFlutterBinding.ensureInitialized();

  // ローカル通知初期化
  // 詳細省略(NotificationServiceOというシングルトンクラス内に、initOという初期化メソッドを作成している)
  await NotificationServiceO.notificationServiceO.initO();

  // アプリを通知から起動したか否かを判定するプロパティを取得するメソッド
  // detailsO.payload でペイロード(通知から渡される文字列)にアクセスできる
  // ※payloadは、「show」または「zonedSchedule」メソッド内で設定(詳細省略)
  var detailsO = await flutterLocalNotificationsPluginO
      .getNotificationAppLaunchDetails();

  // アプリを通知から起動した場合は、MyAppにペイロードを引数として渡す
  // 通知からの起動ではない場合は、空白文字を渡す
  runApp(child: MyApp(
    payloadO: (detailsO.didNotificationLaunchApp) ? detailsO.payload : "",
  ));
}

// 以降、MyAppクラス以下で、detailsO.payload の内容に応じた処理を書いていく

  

「getNotificationAppLaunchDetails()」メソッドで取得するプロパティ経由で、通知をタップしたときに、通知内容をアプリに渡すための「payload」(※)にアクセスできる。

 

(※)手動通知の「show」メソッド、またはスケジュール通知の「zonedSchedule」メソッドの「payload」属性に設定するString型変数

 

また、上記記事の中で、通常のアプリ起動時にも「payload」が渡されてしまう旨のコメントがあったが、自分の場合は、「didNotificationLaunchApp」が「false」だった場合は、「payload」を空白文字に設定した上で、MyAppクラスに渡すことで回避できた。

 

\ Flutterの学習で役立ったコンテンツ・書籍 /

 

 

 

 


Dart入門 – Dartの要点をつかむためのクイックツアー
タイトルとURLをコピーしました