Flutter2でもプッシュ通知を簡単に実装したい
1. はじめに
Flutterの進化は目まぐるしいですよね。今年の5月にはFlutter2がリリースされ、 先日のv2.2のリリースでは、 主要なFirebase関連のプラグインもアップデートされました。
プッシュ通知を送る、FirebaseCloudMessaging(以下FCM)プラグインであるfirebase_messagingもその例外ではありません。v9からv10へのアップデートに伴い、APIが大きく変わりました。 Flutter2を使用するためには、FCMプラグインも最新にしないといけないため、対応に追われてる方も多いと思います。残念ながら、ネット上の解説記事はfirebase_messaging v9以前の旧APIのものが多いため、参考になりません。
firebase_messaging v10の問題
2021年7月現在、firebase_messagingはv10です。
v9以前とは異なり、デフォルトで以下の制限があります。
- フォアグラウンド通知を受け取れない(iOS)
- フォアグラウンド通知を受け取れない(Android)
フォアグラウンド通知を有効化する
フォアグラウンド通知を有効にするには、iOS、Android個別に対応する必要があります。
iOS
iOSの場合は、以下メソッドをFlutterで呼び出すだけでokです。
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true, // Required to display a heads up notification
badge: true,
sound: true,
);
Android
Androidの設定はiOSと比べて手順が多いです。flutter_local_notificationsというパッケージを使用し、Kotlinのコードを書く必要があります。詳しい実装はこちら。
fcm_configパッケージ
そこで登場するのがこのfcm_configパッケージ。iOS、Androidでの通知機能を簡単に実装できます。ネイティブコードを書く必要はありませんし、通知を受け取るだけであれば、追加でコードを書く必要さえありません。公式はこちら。
2. 実装
今回はfcm_configパッケージを使用し、プッシュ通知を実装していきます。
環境
- Flutter stable v2.2.3
- firebase_messaging v10.0.3
- fcm_config v3.0.7
事前準備
- FlutterFire パッケージの導入が完了していること
まだの方はこちらからどうぞ。
iOS
- Apple Developer Accountの登録が完了していること
- 通知設定が完了していること
まだの方はこちらからどうぞ。 - 実機を持っていること
Android
設定は必要ありません。
Apple Developer Accountは毎年12,980円かかるため、未登録の方は、Androidで動作確認をするのがオススメです。Emulatorも使えますので実機不要です。
fcm_configを追加
flutter pub add fcm_config
もしくは以下をpubspec.yamlに追加してください。
dependencies:
fcm_config: ^3.0.7
バックグラウンド+ターミネーテッド状態で通知を受け取る
以下の実装をすることにより、アプリがバックグラウンド+ターミネーテッド状態でも通知を受け取れるようになります。詳しくはこちら。
Future<void> _fcmBackgroundHandler(RemoteMessage message) async {
print("Handling a background message: ${message.messageId}");
}
上記関数をトップレベルで作成し、fcm_configパッケージ初期化時のonBackgroundMessageに渡します。
void main() {
// fcm_configパッケージを初期化
FCMConfig.instance.init(onBackgroundMessage:_fcmBackgroundHandler);
runApp(MaterialApp(
home: MyHomePage(),
));
}
トークンを取得する
サーバから端末(例えばスマフォ)へ通知を送るためには、端末に紐づけられたトークンにアクセスしなければいけません。
トークンは端末が自動的に作成し、Cloud Messaging moduleによってアクセスされます。
詳しい説明はこちら。
以下メソッドによってトークン取得が可能です。Cloud Firestoreを利用している場合、こちらに保存するといいでしょう。
final token = await FCMConfig.messaging.getToken();
print(token);
通知を受け取る
ダイアログ
通知が来た時のダイアログは以下のように書きました。
今回はテスト通知を送るだけなので、タイトルおよび本文はハードコーディングしました。
Future<void> dialog() {
return showDialog(
context: context,
builder: (_) {
return AlertDialog(
title: Text("通知"),
content: Text("通知がきました"),
actions: <Widget>[
// ボタン領域
TextButton(
child: Text("Cancel"),
onPressed: () => Navigator.pop(context),
),
TextButton(
child: Text("OK"),
onPressed: () => Navigator.pop(context),
),
],
);
},
);
}
通知が来た際の処理
端末に通知を送る前に、通知を受け取れるようにします。
FCMNotificationListener はfcm_configパッケージで用意されているWidgetです。
アプリがフォアグラウンド状態で新しい通知が来るたびに、呼ばれます。
今回は、通知が来た際、↑のダイアログが呼ばれるようにしました。
FCMNotificationListener(
onNotification: (RemoteMessage notification, _) async {
await dialog();
}
通知を送信する
Firebaseのダッシュボード上からCloud Messagingタブを選択します。
その後、タイトル、本文を追加、トークンを指定して、テストをタップすれば、スマフォに通知が飛んできます。
3. まとめ
いかがでしたでしょうか。fcm_configパッケージを使って簡単にプッシュ通知が実装できたと思います。一部機能には制限がありますが、シンプルな通知を実装するだけであれば十分ではないでしょうか。
コードは以下に置いておきます。常識の範囲内でご自由にお使いください。
今後もFlutter、Firebase関連のチュートリアルをあげていく予定です。知りたいことありましたらこちらにコメントください!
Discussion