web-dev-qa-db-ja.com

IOS FCMによるデータ通知

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()はアプリが起動されたときにのみ呼び出されるため、バックグラウンドメッセージはありませんデータメッセージを送信すると表示されます。

10
Shayan C

私がこれまでのところ理解していることから、ios側でこの問題を適切に解決する方法はありません。アプリケーションはすべての状態(フォアグラウンド、バックグラウンド、クローズ)で起動されるため、Android側で完全に動作します。

送信できるメッセージには次の2種類があります。

通知メッセージこれは、オペレーティングシステムによって直接表示および処理されます。

data-messageこれはアプリケーションによって処理されます。

カスタムタグを追加すると、タグはデータメッセージになり、アプリケーションで処理する必要があります。データメッセージにcontent_availableタグを追加して、アプリケーションにメッセージを知らせることができますが、問題は、アプリケーションがフォアグラウンド(開いている)またはバックグラウンドで(最小化)。ユーザーがアプリケーションを「強制終了」した場合、バックグラウンド通知が有効になっていても、データメッセージはアプリケーションに配信されません。

解決策は、サーバー側で対象ユーザーを処理し、1対1のデバイストークンとユーザーの関係を維持することにより、複数ユーザーと1つのデバイストークンの問題を解決することです。

16
Shayan C

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
    }
}
16
brozot

通知の優先度が高く設定されている場合、アプリが強制終了されると通知が到着することに気付きました。

{  "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に接続する必要があります。この方法では、現在ログインしているユーザーのみがメッセージを受信します。

12
Prcela

Firebaseからの不十分なドキュメント!

IOSの場合、アプリが終了するとデータメッセージを受信できません。しかし、これはドキュメントのどこにも記載されていません。だから私はFirebaseに連絡しましたが、これは彼らが言ったことです。

「content_availableパラメーターがありますが、アプリが強制終了されたときにデータメッセージを受信できません。バックグラウンドおよびフォアグラウンドでのみ受信できます。アプリが強制終了されたときにデータメッセージを受信する場合は、メッセージを表示します。

したがって、AndroidとFCMのIosに同じペイロードを使用することを考えた場合は、iOSにAPNSを使用することをお勧めします。

12
emilpmp

重要な問題は、ログインしている最新のIDの特定のユーザーグループにメッセージを送信することです。

実際には、トピックメッセージングを使用して問題を解決できます。 3つのユーザータグ/グループA、B、Cがあるとします。FCMが初期化されたら、すべてのユーザーの1つのトピックに登録して、すべてのユーザータグにメッセージを送信できるようにします。

特定のユーザータグについて、ユーザーがAとしてサインインした場合、Aをサブスクライブします。ユーザーがサインアウトしてBとしてサインインした後、ユーザーがA/Cをサブスクライブしているかどうかを確認します。はいの場合、A/Cからサブスクライブ解除してからBにサブスクライブします。これにより、データセクションに含まれるタグの処理を回避できます。

2
Wendy Chan