複数の端末にメッセージを送信する

Firebase Cloud Messaging では、複数の端末をメッセージの対象にする方法が 2 つあります。

このチュートリアルは、FCM 用に HTTP または XMPP プロトコルを使用するアプリサーバーからのトピック メッセージの送信、および iOS アプリでのそれらのメッセージの受信と処理に重点を置いています。 このページには、この操作を行うためのセットアップから検証にいたるすべての手順を記載しているため、FCM 用の iOS クライアント アプリの設定や、最初のメッセージ送信の全ステップを既に行っている場合は、完了済みの手順が含まれている場合があります。

Firebase を iOS プロジェクトに追加する

このセクションで説明しているタスクは、アプリの他の Firebase 機能を既に有効にしている場合は完了済みの場合があります。特に通知の場合は、APNs 証明書をアップロードしてリモート通知に登録する必要があります。

事前準備

事前に次の環境を準備しておく必要があります。

  • Xcode 7.0 以降。
  • クラウド メッセージング用:
    • 物理 iOS 端末。
    • プッシュ通知を有効にした APNs 証明書
  • Xcode プロジェクトとバンドル識別子。
  • CocoaPods 1.0.0 以降。

Xcode プロジェクトをまだ用意していない場合、Firebase 機能を試すだけであれば、クイックスタート サンプルをダウンロードしてご利用いただけます。クイックスタートを使用する場合は、バンドル識別子が次のステップで必要になるため、プロジェクト設定からバンドル識別子を忘れずに取得してください。

アプリに Firebase を追加する

Firebase をアプリに追加するには、Firebase プロジェクトと、アプリ用の Firebase 設定ファイルが必要です。

  1. Firebase プロジェクトをまだ用意していない場合は、Firebase console で Firebase プロジェクトを作成します。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[新規プロジェクトを作成] をクリックします。
  2. [iOS アプリに Firebase を追加] をクリックして設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に実行されることがあります。その場合は、設定ファイルをダウンロードするだけでかまいません。
  3. 求められたら、アプリのバンドル ID を入力してください。必ずアプリで使用しているバンドル ID を入力してください。バンドル ID を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  4. GoogleService-Info.plist ファイルをダウンロードします。このファイルはいつでももう一度ダウンロードできます。
  5. このファイルを Xcode プロジェクトのルートにコピーしていない場合はコピーします。

SDK を追加する

新しいプロジェクトを設定する場合は、SDK をインストールする必要があります。この操作は、Firebase プロジェクトの作成の一環として完了済みの場合があります。

ライブラリをインストールするときは CocoaPods を使用することをおすすめします。インストール手順に沿って CocoaPods をインストールしてください。CocoaPods を使用しない場合は、以下の手順に沿って SDK フレームワークを直接統合する方法もあります。

クイックスタート サンプルをダウンロードして実行することにした場合は、Xcode プロジェクトと Podfile が既に存在します。Firebase ライブラリをプロジェクトに統合する場合は、使用するライブラリ用のポッドをインストールする必要があります。

  1. Xcode プロジェクトをまだ用意していない場合は、作成します。

  2. Podfile がない場合は作成します。

    $ cd your-project directory
    $ pod init
    
  3. インストールするポッドを追加します。次のようにして Podfile にポッドを含めます。

    pod 'Firebase/Core'
    pod 'Firebase/Messaging'
    

iOS アプリで Firebase を稼動させるために必要な必須のライブラリが、Firebase Analytics とともに追加されます。現在使用可能なポッドとサブスペックのリストを以下に示します。機能固有の設定ガイドへのリンクもあります。

  1. ポッドをインストールし、.xcworkspace ファイルを開いて Xcode でプロジェクトを確認します。

    $ pod install
    $ open your-project.xcworkspace
    
  2. Firebase console で GoogleService-Info.plist ファイルをダウンロードし、アプリに含めます。

APNs 証明書をアップロードする

APNs 証明書を Firebase にアップロードします。 まだ APNs 証明書を用意していない場合は、APNs の SSL 証明書のプロビジョニング手順を確認してください。

  1. Firebase console のプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[クラウド メッセージング] タブの順に選択します。

  2. 開発用証明書、本番用証明書、またはその両方の [証明書をアップロード] ボタンを選択します。少なくとも 1 つ選択する必要があります。

  3. 証明書ごとに .p12 ファイルを選択し、必要に応じてパスワードを入力します。この証明書のバンドル ID はアプリのバンドル ID と一致させてください。[保存] を選択します。

アプリで Firebase を初期化する

Firebase 初期化コードをアプリケーションに追加する必要があります。Firebase モジュールをインポートして、次に示すように共有インスタンスを設定します。

  1. Firebase モジュールをインポートします。

    Objective-C

    @import Firebase;
    

    Swift

    import Firebase
    
  2. FIRApp 共有インスタンスを設定します。通常はアプリケーションの application:didFinishLaunchingWithOptions: メソッドを使用します。

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    

    Swift

    // Use Firebase library to configure APIs
    FIRApp.configure()
    

リモート通知に登録する

起動時またはアプリケーション フローの必要な時点で、リモート登録にアプリを登録します。次のように registerForRemoteNotifications を呼び出します。

Objective-C

UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];

Swift

let settings: UIUserNotificationSettings =
UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()

クライアント アプリをトピックに登録する

クライアント アプリは既存のトピックに登録するだけでなく、新しいトピックを作成することもできます。クライアント アプリを新しいトピック名(Firebase プロジェクトにまだ存在していないトピック名)に登録すると、その名前の新しいトピックが FCM に作成され、その後すべてのクライアントはそのトピック名に登録できるようになります。

FIRMessaging クラスは、トピック メッセージング機能を処理します。トピックに登録するには、アプリケーションのメインスレッドから subscribeToTopic:topic を呼び出します(FCM はスレッドセーフではありません)。

[[FIRMessaging messaging] subscribeToTopic:@"/topics/news"];
NSLog(@"Subscribed to news topic");

これにより、FCM バックエンドへの非同期リクエストが作成され、所定のトピックにクライアントが登録されます。最初の登録リクエストが失敗した場合、FCM はトピックに正しく登録できるまで再試行します。アプリが開始するごとに、FCM は、リクエストされたすべてのトピックが登録されたことを確認します。

登録解除するには、unsubscribeFromTopic:topic を呼び出します。これにより、FCM がバックグラウンドでトピックからの登録解除を行います。

メッセージを受信して処理する

FCM は、他のダウンストリーム メッセージと同じようにトピック メッセージを配信します。

クライアント アプリがフォアグラウンドで動作しているときに受信した通知と、クライアントに送信されるすべてのデータ メッセージを処理するには、AppDelegate application:didReceiveRemoteNotification: を実装します。このメッセージは、キーと値の辞書です。

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // Print message ID.
  NSLog(@"Message ID: %@", userInfo[@"gcm.message_id"]);

  // Pring full message.
  NSLog(@"%@", userInfo);
}

Swift

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                 fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // Print message ID.
  print("Message ID: \(userInfo["gcm.message_id"]!)")

  // Print full message.
  print("%@", userInfo)
}

ビルド送信リクエスト

サーバー側からの Firebase Cloud Messaging トピックへのメッセージの送信は、個々の端末やユーザー グループ宛てのメッセージの送信とよく似ています。アプリサーバーは to キーに /topics/yourTopic などの値を設定します。 複数のトピックの組み合わせに送信する場合、アプリサーバーは condition キーを、対象のトピックを指定するブール条件に設定します。たとえば、TopicATopicB または TopicC のいずれかに登録された端末にメッセージを送信する場合は、次のようになります。

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

FCM はまず、かっこ内の条件を評価し、次に左から右に式を評価していきます。上記の式では、いずれか 1 つのトピックだけに登録したユーザーはメッセージを受信しません。同様に、TopicA に登録していないユーザーはメッセージを受信しません。メッセージを受信するのは、次の組み合わせの場合のみです。

  • TopicA と TopicB
  • TopicA と TopicC

トピックの条件では、かっこの使用と、式ごとに 2 つの演算子の使用がサポートされています。

アプリサーバーのキーの詳細については、選択した接続サーバー プロトコル(HTTP または XMPP)の参照情報をご覧ください。 このページの例では、HTTP と XMPP でデータ メッセージをトピックに送信する方法を示しています。

HTTP POST リクエスト

単一のトピックに送信します。

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!",
   }
}

「犬」や「猫」のトピックに登録された端末に送信します。

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

{
  "condition": "'dogs' in topics || 'cats' in topics",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

HTTP レスポンス

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

XMPP メッセージ

単一のトピックに送信します。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to": "/topics/foo-bar",
      "message_id": "m-1366082849205" ,
      "data": {
          "message":"This is a Firebase Cloud Messaging Topic Message!"
      }
  }
  </gcm>
</message>

「犬」や「猫」のトピックに登録された端末に送信します。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
    "condition": "'dogs' in topics || 'cats' in topics",
    "data": {
      "message": "This is a Firebase Cloud Messaging Topic Message!",
     }
  }
  </gcm>
</message>

XMPP レスポンス

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

FCM 接続サーバーが、トピック送信リクエストに成功または失敗のレスポンスを返すまでに、最大 30 秒の遅延が発生する可能性があります。それに応じて、リクエスト内でアプリサーバーのタイムアウト値を必ず設定してください。

メッセージ オプションの完全なリストについては、選択した接続サーバー プロトコル(HTTP または XMPP)の参照情報をご覧ください。

次のステップ

フィードバックを送信...