web-dev-qa-db-ja.com

FCM通知とcollapse_key

私はユーザーに通知を送信していますAndroidデバイスはFirebase Notification consoleを使用しており、ユーザーのデバイスがオフラインのときに10種類の通知を送信しても、ユーザーがオンラインになると彼女/彼はすべて10を受け取ります。

ただし、Firebaseのドキュメントには次のように記載されています。

FCMでは、デバイスごとに最大4つの異なる折りたたみキーをアプリサーバーでいつでも使用できます。つまり、FCM接続サーバーは、デバイスごとに4つの異なる折りたたみ可能なsend-to-syncメッセージを同時に保存でき、それぞれに異なる折りたたみキーがあります。この数を超えると、FCMは4つの折りたたみキーのみを保持し、どのキーが保持されるかは保証されません。

それで、ユーザーは4つの通知だけを受け取るべきではありませんか?何か不足していますか? (私はFirebaseMessagingServiceを拡張していません。通知の処理はSDKに任せています)

[〜#〜] update [〜#〜]:Firebase通知コンソールで折りたたみキーを指定しない場合、暗黙的な折りたたみキーが通知に割り当てられているようです。 パッケージ名アプリの。通知をタップしてアプリを起動したら、getIntent().getExtras()キーセットのすべてのキーと値のペアをチェックすることでテストしました。実際、パッケージ名を指定していなくても、パッケージ名の値を含む_collapse_key_キーを取得しています。

PDATE 2FirebaseMessagingServiceを拡張して通知を処理しようとしたため、アプリがフォアグラウンドにあるときに通知コンソールからメッセージを受信しました。通知メッセージを受け取り、ユーザーに手動で通知を表示します。そして、何を推測します。折りたたみキーはうまく機能します!同じ折りたたみキーで複数の通知を送信しても、1つの通知を受け取ります。 [〜#〜] but [〜#〜]アプリがフォアグラウンドにある場合にのみ明らかに発生します。これは、Firebase SDKがアプリがonMessageReceived()を呼び出さないためですバックグラウンドで、代わりに通知自体を処理します。これはFirebase SDKのバグであることを意味しますか? (SDKによって通知が表示されたときにのみ問題が発生するため)

質問は残っていますが、各通知に同じ折りたたみキーがあるのに、なぜ10通知すべてを受け取るのですか? FCMのバグでしょうか?

10
steliosf

投稿とコメントを読んだ後、試したすべてのこと、どの作業が成功したか、どの作業が失敗したかは完全にはわかりません。アイテムの数をカバーし、何かが役に立てば幸いです。

投稿によると、一部のテストでは、Firebaseコンソールでメッセージを作成するときに折りたたみキーを指定しました。それは不可能です。 詳細オプションを開き、カスタムデータの下にキー/値ペアを入力した場合、これは機能しません。これらの値は、_collapse_key_が表示されるメッセージの最上位レベルではなく、dataキーの下のメッセージに格納されます。また、 ドキュメントの表1 には、dataキーをテーブル内の予約語にしてはならないという警告が含まれており、特に_collapse_key_を引用しています:

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

投稿へのコメントで述べたように、コンソールは自動的にパッケージ名である折りたたみキーを割り当てるため、折りたたみキーをユーザーが入力する必要はありません。

とはいえ、コンソールでの私の経験はあなたのものと同じです。 Message textとデバイストークンのみを入力してメッセージを作成します。折りたたみ処理はありません。各メッセージはデバイスによって受信されます。以下で説明するテストでの私の経験に基づくと、これはコンソールの問題であり、折りたたみ処理の問題ではないようです。これは奇妙です。アプリがフォアグラウンドにあるときにメッセージを送信し、onMessageReceived()が呼び出された場合、 getCollapseKey( ) 。その出力は、キーが存在し、それが私のアプリパッケージ名であることを確認します。

クラウド機能から通知を送信するいくつかのテストを実行したことを示しています。私はこのクラウド機能を使用して独自のテストを行い、予想されるメッセージの崩壊を観察しました。

_exports.test = functions.database.ref('/test').onWrite(event => {
  const token = 'dK1FjGbNr6k:APA91bH7Vz3x...icGO56sJ7rAqOXRI';

  console.log('Sending notification...');

  const payload = {
    notification: {
      title: 'Message',
      body: 'Just one please!'
    }
  };

  const options = {
    collapseKey: 'green'
  };

  return admin.messaging().sendToDevice(token, payload, options).then(response => {
    console.log('Done');
  });
});
_

また、ブラウザアプリのAdvanced Rest Clientを使用してこのメ​​ッセージを送信し、正しいメッセージが折りたたまれていることも確認しました。

_{
  "to": "dK1FjGbNr6k:APA91bH7Vz3x...O56sJ7rAqOXRI",
  "collapse_key": "green",
  "notification": {
    "title": "Message",
    "body": "Just one please!"
  }
}
_

また、通知メッセージを受信したときにFirebaseが分析ログメッセージを送信することについても説明します。これは、受信したメッセージの数を取得したい場合のテストに役立ちます。

_D/FA: Logging event (FE): notification_receive(_nr), Bundle[{firebase_event_Origin(_o)=fcm, message_device_time(_ndt)=0, message_time(_nmt)=1498227476, message_id(_nmid)=6447126672094369335}]
_
5
Bob Snyder