web-dev-qa-db-ja.com

Firebase NotificationをCURL経由ですべてのデバイスに送信するにはどうすればよいですか?

すべてのアプリユーザー(Android)に通知を送信しようとしていますが、Firebase管理コンソール経由で通知が送信されたときに何が起こるかを本質的に複製しています。私が始めたCURLコマンドは次のとおりです。

curl --insecure --header "Authorization:key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Content-Type:application/json" -d "{\" notification\":{\" title\":\" note -タイトル\ "、\" body\":\" note-Body\"}}" https://fcm.googleapis.com/fcm/send

ここでは、JSONが解析されて、見やすくなりました。

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    }
}

返される応答はわずか2文字です。

それは、「to」という言葉です。 (ヘッダーは400を報告します)これは、JSONに "to"がないことと関係があると思います。 「to」には何を入れますか?定義されているトピックはありません。また、デバイスは何も登録していません。それでも、Firebase管理パネルから通知を受け取ることはできます。

Firebase通知処理には驚くべき制限があるため、「データのみ」のJSONパッケージを試してみたいと思います。アプリがフォアグラウンドにある場合、通知はYOURハンドラーによって処理されますが、アプリがバックグラウンドにある場合、 Firebaseサービスによって内部的に処理され、通知ハンドラーに渡されることはありません。明らかに、APIを介して通知リクエストを送信する場合は回避できますが、データのみで送信する場合のみです。 (それにより、同じメッセージでiOSとAndroidを処理する機能が破壊されます。)JSONの「通知」を「データ」に置き換えても効果はありません。

OK、それから私はここで解決策を試みました: Firebase Java Serverはすべてのデバイスにプッシュ通知を送信します 「OK、誰にでも通知は可能ですが、管理コンソール... APIを介して実際に実行することはできません。」回避策は、各クライアントにトピックをサブスクライブさせてから、そのトピックへの通知をプッシュすることです。そのため、まずonCreateのコード:

FirebaseMessaging.getInstance().subscribeToTopic("allDevices");

その後、私が送信する新しいJSON:

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}

そのため、少なくともサーバーから実際の応答を取得しています。 JSONレスポンス:

{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}

そして、それはHTTPコード200が付属しています。OK...によれば https://firebase.google.com/docs/cloud-messaging/http-server-ref 「InvalidRegistration」の200コード登録トークンに問題があることを意味します。多分?ドキュメントのその部分はメッセージングサーバーに関するものだからです。通知サーバーは同じですか?不明。トピックがアクティブになるまでに数時間かかる場合があることを他の場所で確認します。それは新しいチャットルームを作成するのに役に立たないように思われるので、それも同様にオフに思えます。

Firebaseを使用したことがないのに、ほんの数時間で通知​​を受け取るアプリをゼロからコード化できたとき、私はとても興奮していました。たとえば、Stripe.comのドキュメントのレベルに達するまでには長い道のりがあるようです。

結論:管理コンソール機能をミラーリングするためにアプリを実行しているすべてのデバイスにメッセージを送信するためにどのJSONを提供するかを誰もが知っていますか?

55
Anders8

Firebase Notificationsには、メッセージを送信するAPIがありません。幸い、Firebase Cloud Messagingの上に構築されており、まさにそのようなAPIを備えています。

Firebase NotificationsとCloud Messagingを使用すると、いわゆるダウンストリームメッセージを3つの方法でデバイスに送信できます。

  1. 特定のデバイスへ 、デバイスIDがわかっている場合
  2. デバイスのグループへ 、グループの登録IDがわかっている場合
  3. トピックへ 、これはデバイスがサブスクライブできる単なるキーです

すべてのデバイスに明示的に送信する方法はないことに注意してください。ただし、これらの各機能を使用してこのような機能を構築できます。

トピックに送信するために、コマンドに構文エラーがあります。トピックは、/topics/で始まることで識別されます。コードにそれがないため、サーバーはallDevicesをデバイスIDとして解釈します。デバイス登録トークンには無効な形式であるため、エラーが発生します。

トピックへのメッセージ送信に関するドキュメントから:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}
70

プッシュ通知をすべてのデバイスに送信する最も簡単な方法は、それらをトピック「all」にサブスクライブしてから、このトピックに通知を送信することです。これをメインアクティビティにコピーします

FirebaseMessaging.getInstance().subscribeToTopic("all");

ここでリクエストを送信します

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}

これは非効率的または非標準的な方法かもしれませんが、前述したように最も簡単です。プッシュ通知をallデバイスに送信するより良い方法がある場合は投稿してください。

Firebase Cloud Messagingを使用してプッシュ通知を送信するのが初めての場合は、このチュートリアルに従うことができます チュートリアル-FCMを使用したプッシュ通知

51
Syed Rafay

そのための1つの方法は、すべてのユーザーのデバイスにトピックをサブスクライブさせることです。そのようにして、特定のトピックをメッセージのターゲットにすると、すべてのデバイスがそれを取得します。これは、Firebaseコンソールの[通知]セクションでどのように行われるかと思います。

4

ログインするすべてのユーザーを特定のトピックにサブスクライブさせ、そのトピックに通知を送信するだけです。

1