103

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

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

見やすいように解析された JSON は次のとおりです。

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

返される応答は、次の 2 文字だけです。

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

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

わかりました、それから私はここで解決策を試みました:Firebase Java Server to send push notifications to all devices これは、「わかりました、管理コンソールを介して全員に通知することは可能ですが... 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 が付属しています。わかりました... https://firebase.google.com/docs/cloud-messaging/http-server-refによると、「InvalidRegistration」の 200 コードは、登録トークンの問題を意味します. 多分?ドキュメントのその部分はメッセージング サーバー用であるためです。通知サーバーは同じですか? 不明。トピックがアクティブになるまでに数時間かかる場合があることを他の場所で見ています。それは新しいチャットルームを作成するのに役に立たないように見えるので、それもオフのようです.

これまで Firebase を使用したことがなかったときに、わずか数時間で通知​​を受け取るアプリをゼロからコーディングできるようになったときは、非常に興奮しました。たとえば、Stripe.com のドキュメントのレベルに達するまでには、まだ長い道のりがあるようです。

結論: アプリを実行しているすべてのデバイスにメッセージを送信して、管理コンソールの機能をミラーリングするために、どの JSON を指定すればよいか知っている人はいますか?

4

10 に答える 10

112

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

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

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

すべてのデバイスに明示的に送信する方法はないことに注意してください。ただし、これらのそれぞれでこのような機能を構築できます。たとえば、アプリの起動時にアプリをトピックにサブスクライブするか (例: /topics/all)、すべてのデバイス ID のリストを保持してから、それらすべてにメッセージを送信します。

トピックに送信するために、コマンドに構文エラーがあります。トピックは で始まることで識別され/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!",
   }
}
于 2016-07-07T14:36:26.937 に答える
1

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

于 2018-06-02T02:40:43.377 に答える