Closed9

FCMで複数端末にメッセージを送信したい。

若槻龍太若槻龍太

https://firebase.google.com/docs/cloud-messaging/ios/topic-messaging?hl=ja

  • トピック メッセージングは​​、天気やその他の公開情報などのコンテンツに最適です。
  • トピック メッセージは、待ち時間ではなくスループットを重視して最適化されています。単一のデバイスまたはデバイスの小さなグループに高速かつ安全に配信するには、メッセージのターゲットをトピックではなく登録トークンにします。

https://firebase.google.com/docs/cloud-messaging/ios/device-group?hl=ja

デバイス グループ メッセージングを使用すると、複数のデバイスを 1 つのグループに追加できます。これはトピック メッセージングに似ていますが、グループ メンバーシップがサーバーによってのみ管理されるようにするための認証が含まれています。たとえば、異なる電話モデルに異なるメッセージを送信する場合、サーバーは適切なグループへの登録を追加/削除し、適切なメッセージを各グループに送信できます。デバイス グループ メッセージングは​​、アプリケーション内で直接ではなく、サーバーからデバイス グループを管理するという点で、トピック メッセージングとは異なります。

送信対象をサーバー側で管理したいならデバイスグループの方が適していそう。

若槻龍太若槻龍太

デバイスグループを使わなくても、getMessaging().sendMulticast(message)で普通にマルチキャストできるっぽい。
https://firebase.google.com/docs/cloud-messaging/send-message?hl=ja#send-messages-to-multiple-devices

// Create a list containing up to 500 registration tokens.
// These registration tokens come from the client FCM SDKs.
const registrationTokens = [
  'YOUR_REGISTRATION_TOKEN_1',
  // …
  'YOUR_REGISTRATION_TOKEN_N',
];

const message = {
  data: {score: '850', time: '2:45'},
  tokens: registrationTokens,
};

getMessaging().sendMulticast(message)
  .then((response) => {
    console.log(response.successCount + ' messages were sent successfully');
  });
若槻龍太若槻龍太

firebase-adminのMessaging classではどう使えば良い?

以前確認した単一の宛先への送信方法。

https://dev.classmethod.jp/articles/firebase-admin-node-js-sdk/

import * as firebaseAdmin from 'firebase-admin';

const FCM_TOKEN = process.env.FCM_TOKEN as string;

firebaseAdmin.initializeApp();

const sendMessage = async () => {
  const params = {
    notification: {
      title: 'チケット当選のご案内',
      body: 'チケットをご用意いたしました。',
    },
    token: FCM_TOKEN,
  };

  await firebaseAdmin.messaging().send(params);
};

sendMessage();
若槻龍太若槻龍太

NodejsのMessaging classにはsendAllsendMulticastがある。

https://firebase.google.com/docs/reference/admin/node/firebase-admin.messaging.messaging?hl=ja#methods

  • sendAll:指定されたアレイ内のすべてのメッセージをFirebaseCloudMessaging経由で送信します。バッチ処理を使用して、リスト全体を単一のRPC呼び出しとして送信します。 send()メソッドと比較して、このメソッドは複数のメッセージを送信するための非常に効率的な方法です。戻り値から取得された応答リストは、 MulticastMessage内のトークンの順序に対応しています。このメソッドのエラーは、完全な失敗を示します。つまり、リスト内のどのメッセージも送信できませんでした。部分的な障害は、 BatchResponseの戻り値で示されます。
  • sendMulticast:指定されたマルチキャストメッセージを、指定されたすべてのFCM登録トークンに送信します。このメソッドは、内部でsendAll() APIを使用して、指定されたメッセージをすべてのターゲット受信者に送信します。戻り値から取得された応答リストは、 MulticastMessage内のトークンの順序に対応しています。このメソッドからのエラーは、完全な失敗を示します。つまり、メッセージはリスト内のどのトークンにも送信されませんでした。部分的な障害は、 BatchResponseの戻り値で示されます。

同じメッセージを複数端末に送信したい場合はsendMulticastが適してそう。

sendMulticastの実装例。

export const sendMulticast = async (
  firebasePrivateKey: string,
  fcmTokens: string[],
  messageTitle?: string,
  messageBody?: string,
) => {
  initializeApp(firebasePrivateKey);

  const params = {
    notification: {
      title: messageTitle,
      body: messageBody,
    },
    tokens: fcmTokens,
  };

  await firebaseAdmin.messaging().sendMulticast(params);
};

const initializeApp = (firebasePrivateKey: string) => {
  if (firebaseAdmin.apps.length === 0) {
    firebaseAdmin.initializeApp({
      credential: firebaseAdmin.credential.cert({
        projectId: FIREBASE_PROJECT_ID,
        clientEmail: FIREBASE_CLIENT_EMAIL,
        privateKey: firebasePrivateKey,
      }),
    });
  }
};

Messaging.sendMulticast()では、内部的にはsendAll()を使って1キャストあたり最大500トークンに送信できる。

https://firebase.google.com/docs/reference/admin/node/firebase-admin.messaging.messaging.md?#messagingsendmulticast

Sends the given multicast message to all the FCM registration tokens specified in it.

This method uses the sendAll() API under the hood to send the given message to all the target recipients. The responses list obtained from the return value corresponds to the order of tokens in the MulticastMessage. An error from this method indicates a total failure -- i.e. the message was not sent to any of the tokens in the list. Partial failures are indicated by a BatchResponse return value.

A multicast message containing up to 500 tokens.

このスクラップは4ヶ月前にクローズされました