web-dev-qa-db-ja.com

FirebaseサイレントAPN通知

グーグルのファイアベースを使用してサイレントAPNSを送信する方法はありますか?アプリがバックグラウンドにある場合、常にユーザーに通知が表示されるようです。

ありがとう

23
roiberg

FCMサーバーAPIを使用してサイレントAPNSメッセージを送信できます https://firebase.google.com/docs/cloud-messaging/http-server-ref

特に、以下を使用する必要があります。

  • dataフィールド:

このパラメーターは、メッセージのペイロードのカスタムキーと値のペアを指定します。

たとえば、data:{"score": "3x1"}の場合:

IOSでは、メッセージがAPNS経由で送信される場合、カスタムデータフィールドを表します。 FCM接続サーバー経由で送信される場合、AppDelegate application:didReceiveRemoteNotification:でキー値辞書として表されます。

キーは予​​約語(「from」または「google」または「gcm」で始まる任意のWord)であってはなりません。このテーブルで定義されている単語(collapse_keyなど)は使用しないでください。

文字列型の値が推奨されます。オブジェクトまたは他の文字列以外のデータ型(整数やブールなど)の値を文字列に変換する必要があります

  • content-availableフィールド:

IOSでは、このフィールドを使用して、APNSペイロードで利用可能なコンテンツを表します。通知またはメッセージが送信され、これがtrueに設定されている場合、非アクティブなクライアントアプリが起動されます。 Androidでは、デフォルトでデータメッセージがアプリを起動します。 Chromeでは、現在サポートされていません。

完全なドキュメント: https://firebase.google.com/docs/cloud-messaging/http-server-ref#downstream-http-messages-json

32
Diego Giorgini

FCMサーバーを使用した真のサイレント通知(フォアグラウンドとバックグラウンドの両方)には、次のフィールドを使用します。

"to" : "[token]",
"content_available": true,
"priority": "high",
"data" : {
  "key1" : "abc",
  "key2" : 123
}

注:「content_available」を使用していることを確認してください[〜#〜] not [〜#〜] FCMで「content-available」を使用してください。 APNS用に変換されており、それ以外の場合は正しく受信されません。違いはしばらく私をつまずかせていた。

29
c0deblooded

このトピックについては、ブログで詳しく説明しています。 http://blog.boxstory.com/2017/01/how-to-send-silent-Push-notification-in.html

**キーポイントは: "content_available:true"

これはサンプルJSONです

{
    "to" : "<device>",
    "priority": "normal",
    "content_available": true, <-- this key is converted to 'content-available:1'
    "notification" : {
      "body" : "noti body",
      "title" : "noti title",
      "link": "noti link "
    }
}

注:上記のサンプルJSONが送信された場合、通知はユーザーに表示されます。ユーザーにプッシュ通知を表示したくない場合は、以下を使用します。

{
  "to": "<device>",
  "priority": "normal",
  "content_available": true <-- this key is converted to 'content-available:1'
}
9
Jun-ho Seo

他の回答で示されているようにLegacy HTTPを使用せず、最新のv1 HTTP protocolを使用している人のために、私はついにサイレント通知を送信する正しい方法を見つけました。

firebase-adminを使用したNodeJSの例:

    const message = {
      apns: {
        payload: {
          aps: {
            "content-available": 1,
            alert: ""
          }
        }
      }
    };

    admin
      .messaging()
      .send(message)
      .then(response => {
        // Response is a message ID string.
        console.log("Successfully sent message:", response);
      })
      .catch(error => {
        console.log("Error sending message:", error);
      });

説明:

  • apnsのペイロードはv1 HTTP protocolのFirebaseによって変換されないため、元の"content-available": 1が必要です。
  • alert: ""も必要です。 Pusherなどを使用してサイレント通知を送信しようとすると、content-availableのみがトリガーできないことがわかります。代わりに、soundalertなどの追加フィールドを追加すると機能します。 iOS 7のサイレントプッシュ通知が機能しない を参照してください。 Firebaseは空のサウンドを禁止しているため、空のアラートを使用できます。
0
Robert Ying