Firebase console を使用して iOS でトピック メッセージを送信する

パブリッシュ / サブスクライブ モデルに基づく FCM トピック メッセージングでは、特定のトピックにオプトインした複数の端末にメッセージを送信できます。必要に応じてトピック メッセージを作成し、信頼できる方法で FCM がメッセージをルーティングし、正しい端末に配信します。

たとえば、地域の天気予報アプリのユーザーは、気象警報のトピックにオプトインし、指定した地域に影響を与える暴風雨警報の通知を受信できます。スポーツアプリのユーザーは、お気に入りのチームの実況ゲームスコアの自動更新に登録できます。

トピックに関する留意点を以下に示します。

  • トピック メッセージングは、アプリごとに無制限のトピックとサブスクリプションをサポートします。
  • トピック メッセージングは、ニュース、天気、その他の広く入手可能な情報コンテンツに最適です。
  • トピック メッセージは、待ち時間ではなく、スループットに対して最適化されます。単一の端末または小規模な端末グループに高速で安全な配信を行うには、トピックではなく、トークンをメッセージの対象にしてください
  • メッセージをユーザーごとに複数の端末に送信する必要がある場合は、そのようなユースケース向けの端末グループ メッセージングを検討してください。

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

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

事前準備

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

  • Xcode 7.0 以降
  • iOS 7 以降をターゲットにした Xcode プロジェクト
  • アプリのバンドル識別子
  • CocoaPods 1.0.0 以降
  • クラウド メッセージングの場合
    • 物理 iOS 端末
    • プッシュ通知を有効にした APNs 証明書
    • Xcode において [アプリケーション] > [機能] でプッシュ通知を有効にする

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 とともに追加されます。現在使用可能なポッドとサブスペックのリストを以下に示します。機能固有の設定ガイドへのリンクもあります。

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

    $ pod install
    $ open your-project.xcworkspace
    
  5. 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 モジュールを UIApplicationDelegate サブクラスにインポートします。

    Objective-C

    @import Firebase;
    

    Swift

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

    Objective-C

     verbatim f4837415eb98478ae53b9bc9796b0226 // Use Firebase library to configure APIs
    [FIRApp configure]; endverbatim f4837415eb98478ae53b9bc9796b0226 
    

    Swift

     verbatim 2ac23ab3ab1009da8a019fb5469208e7 // Use Firebase library to configure APIs
    FIRApp.configure() endverbatim 2ac23ab3ab1009da8a019fb5469208e7 
    

リモート通知に登録する

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

Objective-C

 verbatim aa5edcafd309b6a13d515cfcfe63368e if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
  // iOS 10 or later
  #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
  UNAuthorizationOptions authOptions =
      UNAuthorizationOptionAlert
      | UNAuthorizationOptionSound
      | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) {
      }];

  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  // For iOS 10 data message (sent via FCM)
  [FIRMessaging messaging].remoteMessageDelegate = self;
  #endif
}

[[UIApplication sharedApplication] registerForRemoteNotifications]; endverbatim aa5edcafd309b6a13d515cfcfe63368e 

Swift

 verbatim 3522a9bf8d31feb57becbf87e271a1fb if #available(iOS 10.0, *) {
  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: {_, _ in })

  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self
  // For iOS 10 data message (sent via FCM)
  FIRMessaging.messaging().remoteMessageDelegate = self

} else {
  let settings: UIUserNotificationSettings =
  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()
 endverbatim 3522a9bf8d31feb57becbf87e271a1fb 

iOS クライアント アプリでトピック メッセージを受信する

トピックに登録する

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

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

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

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

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

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

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

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

Objective-C

 verbatim 7d41e0ff98611196863d03a32d190f08 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // 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.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

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

- (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.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

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

  completionHandler(UIBackgroundFetchResultNewData);
} endverbatim 7d41e0ff98611196863d03a32d190f08 

Swift

 verbatim dd7a0cfbd6eb8c548c47d07c8ef2c04b func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // 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.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (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.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  completionHandler(UIBackgroundFetchResult.newData)
} endverbatim dd7a0cfbd6eb8c548c47d07c8ef2c04b 

Notifications コンソールからトピック メッセージを送信する

  1. ターゲット端末でアプリをインストールして実行します。

  2. Firebase console の [Notifications] タブを開き、[新しいメッセージ] を選択します。

  3. メッセージのテキストを入力します。
  4. メッセージ ターゲットの [トピック] を選択します。
  5. トピックリストから、対象にするトピックを選択します。このリストには、この Firebase プロジェクトで有効なサブスクリプションがあるすべてのトピックのデータが入力されます(コンソールに新しいトピックが表示されるまでに 1 日程度の遅延が発生することがあります)。

[メッセージを送信] をクリックすると、Firebase はそのトピックに登録しているすべてのクライアント アプリ インスタンスにメッセージを配信します。

コンソールのフィールドとメッセージ ペイロード

Notifications コンソールから通知メッセージを送信する場合、Google は Composer で入力されたフィールドを次の 2 つの方法で使用します。

  1. [ユーザー セグメント] や [有効期限] などのフィールドによってメッセージのターゲットと配信オプションを決定します。
  2. [メッセージ文] や [カスタムデータ] などのフィールドは、Key-Value ペアで構成されたペイロードでクライアントに送信されます。

後者のキーの一部は FCM サーバー API を通じて使用することもできます。たとえば、[カスタムデータ] に入力された Key-Value ペアは通知のデータ ペイロードとして処理されます。他のフィールドは FCM 通知ペイロードのキーに直接マッピングされます。

Notifications コンソールの一部のフィールドは FCM サーバーの API では使用できないことに注意してください。たとえば、アプリ、アプリ バージョン、言語に基づいてユーザー セグメントをターゲット設定できても、サーバー API で to フィールドを使用する場合は利用できない可能性があります。

Notifications コンソールからクライアントに送信されるキーには次のものがあります。

キー コンソール フィールドのラベル 説明
notification.title メッセージ タイトル 通知のタイトルを示します。
notification.body メッセージ文 通知の本文テキストを示します。
data カスタムデータ 定義した Key-Value ペア。これらのペアは、処理するアプリのデータ ペイロードとして配信されます。

メッセージの配信を決定するキーには次のものが含まれます。

キー コンソール フィールドのラベル 説明
priority 優先度

メッセージの優先度を設定します。

詳細については、メッセージの優先順位の設定をご覧ください。

sound 通知音

端末が通知を受信したときに再生する通知音を示します。

time_to_live 有効期限

このパラメータでは、端末がオフラインの場合にメッセージを FCM のストレージに保持する期間(秒単位)を指定します。詳細については、メッセージの有効期間の設定をご覧ください。

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