私はフラッターとダートが初めてです。アプリを [〜#〜] fcm [〜#〜] に接続しようとしています。アプリがフォアグラウンドにある場合、flutterLocalNotificationsPluginを作成し、すべてが正常に機能しますが、アプリがバックグラウンドにある場合、onMessageメソッドを処理する方法がありません。誰かが私がそれをどのように解決できるか考えていますか?
FirebaseMessaging firebaseMessaging = new FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
@override
void initState() {
super.initState();
var androidInitSettings = new AndroidInitializationSettings('mipmap/ic_launcher');
var iosInitSettings = new IOSInitializationSettings();
var initSettings = new InitializationSettings(androidInitSettings, iosInitSettings);
flutterLocalNotificationsPlugin.initialize(initSettings, selectNotification: onSelectNotification);
firebaseMessaging.configure(
onLaunch: (Map<String, dynamic> msg) {
print(" onLaunch called ${(msg)}");
},
onResume: (Map<String, dynamic> msg) {
print(" onResume called ${(msg)}");
},
onMessage: (Map<String, dynamic> msg) {
showNotification(msg);
print(" onMessage called ${(msg)}");
},
);
firebaseMessaging.requestNotificationPermissions(const IosNotificationSettings(sound: true, alert: true, badge: true));
firebaseMessaging.onIosSettingsRegistered.listen((IosNotificationSettings setting) {
print('IOS Setting Registed');
});
firebaseMessaging.getToken().then((token) {
update(token);
});
}
最後のプラグインによるとFirebase Cloud Messaging for Flutterバージョン4.0.0 + 1、プッシュ通知を作成またはコンパイルするときコンソールまたはフォームで必ず含める
click_action: FLUTTER_NOTIFICATION_CLICK
Androidデバイスをターゲットにする場合の「カスタムデータ」キーと値のペア(「詳細オプション」の下)として。このオプションは、アプリがバックグラウンド状態のときにonResume
を有効にします。
onMessage
がトリガーされたときに強制的に通知を表示しているようです。アプリがバックグラウンドにある場合は、通知を自動的に作成する必要はありません。
onMessage
は、通知を受信し、アプリが開いてフォアグラウンドで実行されているときにトリガーされます。たとえば、Gmailアプリを開いていて、新しいメールが受信された場合、通知領域に通知を表示する必要はありません。アプリはそれを直接処理することを選択する場合があり、通知が受信されるとすぐにonMessage
がトリガーされます。これは良いことなので、サーバーをプールし続ける必要はありません。
onResume
とonLaunch
は少し異なります。これらの2つのイベントは、通知を受信してもトリガーされません。これらは、ユーザーが通知領域から通知を選択/タップしたときにのみトリガーされます。したがって、どちらの場合も、アプリは現在、まったく実行されていない(終了している)か、バックグラウンドで表示されていないために非表示になっています。この場合、通知は電話で受信され、通知領域に自動的に配置されます(そのために「showNotification
」をコーディングする必要はありません)。この状態では、ユーザーは通知を見ることができますが、アプリ自体はまだ通知を認識していません。
アプリは、ユーザーがこれらの通知の1つを選択した場合にのみ、通知を認識します。
アプリがまったく実行されていない場合、ユーザーが通知をタップするとonLaunch
がトリガーされます。これは、アプリが実行されておらず、通知の結果として「最初から起動する」必要があったことを意味します。
アプリがバックグラウンドにある場合、ユーザーが通知を選択するとonResume
がトリガーされ、アプリがフォアグラウンド状態に戻ります。
編集:
@boformerが指摘しているように、これは「通知」メッセージにのみ適用されます。 「データ」メッセージを送信している場合、通知は作成されず、メッセージはonMessage
を介してのみ配信されます。詳細については、 プラグインのreadme および firebase docs をご覧ください。
Dart VMは、アプリがバックグラウンドにある間は実行されません。つまり、ネイティブコード(Java/Kotlin/ObjectiveC/Swift)で通知とデータメッセージを処理する必要があります。
Androidでこれを行うには、 公式ドキュメント を参照してください。
おそらく、firebase_messagingプラグインを削除して、すべてのメッセージ処理を手動で行う必要があります。通知コンテンツをフラッターアプリに送信するには(フォアグラウンドにある間)、プラットフォームチャネルを使用します。
Firebase_messagingプラグインのソースコードを調べて、ネイティブ側で何が起こっているかを確認することは非常に役立ちます。