FCM(firebaseクラウドメッセージング)を使用して、「カスタム」データ通知をIOSアプリに送信します。私が理解していることから、FCMで通知の表示を処理する場合は通知メッセージを使用していますまた、アプリ内でのみメッセージを処理する場合にデータメッセージを使用しますが、これは仕様によるものです。
私が直面している問題は、Device/InstandIDトークンがインストールされたアプリに固有であり、アプリにログインしたユーザーではないということです。そのため、これを解決するために、データ内の目的のユーザータグを送信して、データメッセージにします。アプリはデータ通知を処理するため、didReceiveRemoteNotification()コールバックはアプリが開かれたときにのみ起動され、通知は送信されたときよりもすぐに表示されます。
私の質問は、カスタムデータ通知メッセージを送信して、アプリが閉じられていてもすぐに表示できるようにすることです。
これは私がFCMに送信しているペイロードです。
_{
registeration_ids : [<id_1>, <id_2>],
data : {
title : message_title,
body : message_body,
intended_user : message_user
}
}
_
In Android FirebaseMessagingService.onMessageReceived()
はアプリがバックグラウンドにある場合でも呼び出されますが、iosではdidReceiveRemoteNotification()
はアプリが起動されたときにのみ呼び出されるため、バックグラウンドメッセージはありませんデータメッセージを送信すると表示されます。
私がこれまでのところ理解していることから、ios側でこの問題を適切に解決する方法はありません。アプリケーションはすべての状態(フォアグラウンド、バックグラウンド、クローズ)で起動されるため、Android側で完全に動作します。
送信できるメッセージには次の2種類があります。
通知メッセージこれは、オペレーティングシステムによって直接表示および処理されます。
data-messageこれはアプリケーションによって処理されます。
カスタムタグを追加すると、タグはデータメッセージになり、アプリケーションで処理する必要があります。データメッセージにcontent_available
タグを追加して、アプリケーションにメッセージを知らせることができますが、問題は、アプリケーションがフォアグラウンド(開いている)またはバックグラウンドで(最小化)。ユーザーがアプリケーションを「強制終了」した場合、バックグラウンド通知が有効になっていても、データメッセージはアプリケーションに配信されません。
解決策は、サーバー側で対象ユーザーを処理し、1対1のデバイストークンとユーザーの関係を維持することにより、複数ユーザーと1つのデバイストークンの問題を解決することです。
Content_availableをtrueに設定してみてください。
fcmドキュメントから:
注:アプリがバックグラウンドにあるときに、カスタムKey-Valueのみで構成されるメッセージをiOSデバイスに送信する場合は、データキーでカスタムKey-Valueペアを設定し、content_availableをtrueに設定します。
{
registeration_ids : [<id_1>, <id_2>],
content_available: true,
data : {
title : message_title,
body : message_body,
intended_user : message_user
}
}
通知の優先度が高く設定されている場合、アプリが強制終了されると通知が到着することに気付きました。
{ "notification": {
"body" : "This week’s edition is now available.",
"title": "Portugal vs. Denmark",
"text": "5 to 1",
"content_available": 1
},
"data" : {
"volume" : "3.21.15",
"contents" : "http://www.news-magazine.com/world-week/21659772"
},
"to" : "fqUk65A1kTE:APA91bG5...", // or set topic like "/topics/test"
"priority" : "high"
}
IOSクライアントアプリの場合、通常および高優先度は、APN優先度レベル5および10に類似しています。
IOSのドキュメントから、デフォルトの優先度の通知が配信されない可能性があります。
apns-priority:通知の優先度。次の値のいずれかを指定します。
10 –すぐにプッシュメッセージを送信します。この優先度の通知は、ターゲットデバイスでアラート、サウンド、またはバッジをトリガーする必要があります。コンテンツで利用可能なキーのみを含むプッシュ通知にこの優先度を使用するとエラーになります。
5—デバイスの電力に関する考慮事項を考慮したプッシュメッセージを一度に送信します。この優先度の通知はグループ化され、バーストで配信される場合があります。それらは抑制され、場合によっては配信されません。このヘッダーを省略すると、APNsサーバーは優先順位を10に設定します。
更新1:
上記の通知はFCM APIを介して送信され、アプリが強制終了されている間に受信されました。デバイスの通知をタップすると、アプリの起動後にデバイスログに表示されます。
...didReceiveRemoteNotification: [gcm.message_id: 0:1468481012881485%e1d60a46e1d60a46, volume: 3.21.15, aps: {
alert = {
body = "This week\U2019s edition is now available.";
title = "Portugal vs. Denmark";
};
}, contents: http://www.news-magazine.com/world-week/21659772][;
データ部分も受信メッセージに含まれていることに注意してください。
更新2:
単一のデバイス上の複数のユーザー、または多数のデバイスを持つ1人のユーザー。
サーバー側では、1つの一意のfcm_idが1人のユーザーにのみ割り当てられることを保証する必要があります。つまり、1人のデバイスが1人のユーザーに割り当てられるため、デバイスごとに1人のユーザーのみが通知されます。
また、1人のユーザーが複数のfcm_idを持つことができるため、ユーザーはより多くのデバイスを持ち、サインインできます。
User_2がuser_1と同じデバイスにログインするとき、fcm_idをuser_1から切り離し、user_2に接続する必要があります。この方法では、現在ログインしているユーザーのみがメッセージを受信します。
Firebaseからの不十分なドキュメント!
IOSの場合、アプリが終了するとデータメッセージを受信できません。しかし、これはドキュメントのどこにも記載されていません。だから私はFirebaseに連絡しましたが、これは彼らが言ったことです。
「content_availableパラメーターがありますが、アプリが強制終了されたときにデータメッセージを受信できません。バックグラウンドおよびフォアグラウンドでのみ受信できます。アプリが強制終了されたときにデータメッセージを受信する場合は、メッセージを表示します。
したがって、AndroidとFCMのIosに同じペイロードを使用することを考えた場合は、iOSにAPNSを使用することをお勧めします。
重要な問題は、ログインしている最新のIDの特定のユーザーグループにメッセージを送信することです。
実際には、トピックメッセージングを使用して問題を解決できます。 3つのユーザータグ/グループA、B、Cがあるとします。FCMが初期化されたら、すべてのユーザーの1つのトピックに登録して、すべてのユーザータグにメッセージを送信できるようにします。
特定のユーザータグについて、ユーザーがAとしてサインインした場合、Aをサブスクライブします。ユーザーがサインアウトしてBとしてサインインした後、ユーザーがA/Cをサブスクライブしているかどうかを確認します。はいの場合、A/Cからサブスクライブ解除してからBにサブスクライブします。これにより、データセクションに含まれるタグの処理を回避できます。