CURLを介してすべてのデバイスにFirebase通知を送信するにはどうすればよいですか?


85

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

curl --insecure --header "Authorization:key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Content-Type:application / json" -d "{\" notify \ ":{\" 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パッケージを試してみたいと思います。アプリがフォアグラウンドにある場合、通知はハンドラーによって処理されますが、アプリがバックグラウンドにある場合は、 Firebaseサービスによって内部的に処理され、通知ハンドラに渡されることはありません。明らかに、これはAPIを介して通知リクエストを送信する場合に回避できますが、データのみで送信する場合に限ります。(これにより、iOSとAndroidを同じメッセージで処理する機能が失われます。)JSONのいずれかで「通知」を「データ」に置き換えても効果はありません。

わかりました。次に、ここで解決策 を試しました。FirebaseJavaServerは、すべてのデバイスにプッシュ通知を送信します。「わかりました。管理コンソールからすべてのユーザーに通知できますが、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を知っている人はいますか?


使用しているAPIトークンが正しいことを確認してください。また、GCMメッセージを単一のデバイスに送信して、それが機能するかどうかを確認してください。デバッグでアプリを起動し、ブレークポイントをFirebaseInstanceIdService
Justin Slade 2016

firebase.google.com/docsのグーグル検索で「apitoken」が表示されません。「IDトークン」という意味ですか?または「認証トークン」?それとも、ヘッダーで提供されている私の認証キーについて話しているのですか?これ問題ありません。現在の状態から変更すると、サーバーの応答は、現在表示されているエラーメッセージではなく、「unauthorized」に切り替わります。
Anders8 2016

そのブログは、特定のデバイスにメッセージを送信することに関するもののようであり、元の議論のように、アプリのすべてのユーザーにメッセージを送信することに関するものではありません。
Anders8 2017

詳細については、このブログ投稿を読む- > developine.com/...
Developine

回答:


55

編集:このメソッドはもうサポートされていないようです(@FernandoZamperinへのthx)。他の答えを見てください!

トピックをサブスクライブする代わりに、conditionキーを使用して、グループに属していないインスタンスにメッセージを送信することができます。データは次のようになります。

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}

https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2を参照してください


3
それがベストアンサーです。アプリのアップデートを必要とせずにすぐに実行できます。すごい!
トムマルボロリドル

彼らは本当にそれを使用することをより明確にする必要があります-最終的には1ことが判明
cwiesner

これは有望に見えますが、実際に機能しますか?それはハックのように見えます。サンプルプロジェクトで試してみましたが、動作します。ただし、何千人ものアクティブユーザーがいる私のprodアプリで動作するかどうかはわかりません。誰かがprodアプリでそれを試しましたか?
SahilPatel20年

4
私はかなり長い間このアプローチを使用していて、完全に機能していました。今日、何らかの理由でレガシーAPIに通知を送信すると、エラーなしでmessage_idが返されますが、デバイスはプッシュ通知を受信して​​いません。問題?単一のトークンへの送信をテストしましたが、正常に機能しました。
フェルナンドザンペリン

1
@VitVeres Firebaseサポートチームに問題を送信したところ、「プッシュ通知をファンアウトするための式の現在の使用法はサポートされていません。式にリストされているトピックがアプリプロジェクトに存在することを確認してください。」と返信されました。アプリにトピックを実装する必要があると思います。
フェルナンドザンペリン

98

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

FirebaseNotificationsとCloudMessagingを使用すると、次の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!",
   }
}

{"to": "/ topic / allDevices"、 "data":{"message": "これはFirebaseCloud Messagingトピックメッセージです!"}}を送信しようとしましたが、同じInvalidRegistration応答を受け取りました。それはトピックが無効であることを意味すると思います。コンソールにトピックのデータベースを表示する方法がありません。
Anders8 2016

7
/topics/複数形
Frank van Puffelen 2016

にやにや笑いああ、タイプミス、プログラマーの悩みの種。;)新しい応答は次のとおりです:{"message_id":5115052numbers95180}これは確かにはるかに成功しているように見えます。つまり、管理コンソールには「通知」を介して通知を配信するための強力な機能がありますが、API送信からそれをトリガーする方法はなく、メッセージの使用に自分自身を変換する必要があるということです。(通知に組み込まれているスケジューリングとコンバージョントラッキングが失われます)受信を処理するためのメッセージングコードを探します。フランクに感謝します。:)
Anders8 2016

1
うーん...そうではない。通知コンソールは通知メッセージを送信するだけです(メッセージタイプに関するドキュメントを参照してください)。APIがまだないということは、オーディエンスに送信することだけです。
Frank van Puffelen 2016

1
iOSでも同じですか?同じことを試しましたが、アプリが動作しているときに通知を受け取りますが、バックグラウンドでは機能しません
vinbhai4u 2016

73

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

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

次に、リクエストを次のように送信します

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

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

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


トピックの組み合わせにメッセージを送信するには、条件を指定します。これは、ターゲットトピックを指定するブール式です。たとえば、次の条件は、サブスクライブされているデバイスにメッセージを送信TopicAし、TopicBまたはTopicC次のいずれかです。

{
   "data":
   {
      "title": "Your title",
      "message": "Your message"
      "image-url": "your_image_url"
   },
   "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
}

条件とトピックについて詳しくは、FCMドキュメントをご覧ください。


それは私には理にかなっています。しかし、あなたのように、それが非効率的かどうかはわかりません。誰かがそれを明確にできますか?
JCarlosR 2018

2
私はそれが非効率的だとは思いません、それがすべてのデバイスにプッシュ通知を送信する唯一の可能な方法かもしれません(私は少なくとも他の方法を見つけることができませんでした)
Syed Rafay 2018

1
ベストアンサー!:)
wonsuc 2018年

2
素晴らしい答え。どこにも言及されていないので、関数でService拡張FirebaseMessagingServiceされているこの種のメッセージを受信することを知っておくことが重要です#onMessageReceived。そのため、通知は自動的に表示されないため、自分で処理する必要があります。

4

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


詳細については、このブログ投稿を読む- > developine.com/...
Developine

2

IonicCordovaアプリのプッシュ通知の解決策を探していました。

SyedRafayの回答に感謝します。

app.component.ts

const options: PushOptions = {
  android: {
    topics: ['all']
  },

サーバーのファイル

"to" => "/topics/all",


0

Firebaseコンソールでトピックリストを確認してください。

  1. Firebaseコンソールに移動します

  2. サイドメニューから[成長]をクリックします

  3. [クラウドメッセージング]をクリックします

  4. [最初のメッセージを送信]をクリックします

  5. 通知セクションで、通知タイトル通知テキストに何かを入力します

  6. [次へ]をクリックします

  7. ターゲットセクションでトピックをクリックします

  8. [メッセージトピック]テキストボックスをクリックすると、トピックが表示されます(androidまたはiosというトピックは作成していませんが、これら2つのトピックを表示できます。

  9. プッシュ通知を送信するときは、これを条件として追加します。

    "condition" => "トピックの 'all' ||トピックの 'android' ||トピックの 'ios'"、

全身

array(
    "notification"=>array(
        "title"=>"Test",
        "body"=>"Test Body",
    ),
    "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics",
);

さらにトピックがある場合は、||でそれらを追加できます。(または)条件、その後、すべてのユーザーがあなたの通知を受け取ります。テストして私のために働いた。


-4

「/ topics / all」を使用して、すべてのデバイスに通知を送信できます

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

{
  "to": "/topics/all",
  "notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" },
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

これは新しい機能ですか?または、これにはアプリが「すべて」にサブスクライブする必要がありますか?
Anders8 2017

これはデフォルトの機能です。私はどのトピックも購読していません。それは私のために働いています。しかし、私はトークン登録をしました。「getToken」
Siva Karuppiah 2017

1
はい、メッセージIDを受け取りますが、「all」という名前のトピックがない限り、どのデバイスにも何も送信されません。
Abdalrahman Shatou 2017

いいえ。Androidデバイスで通知を受け取りました(2つ)。スクリーンショットを添付しますか?私はioincの上に私のアプリを構築します。
Siva Karuppiah 2017

これは私にとってはうまくいきます。なぜこれが反対票を投じられているのかわからない。
m1crdy 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.