Firebase Cloud Messaging を使ってみる


このクイックスタートでは、メッセージを確実に送信できるように、モバイル クライアント アプリとウェブ クライアント アプリで Firebase Cloud Messaging を設定する方法について説明します。サーバー環境については、サーバー環境と FCM をご覧ください。

Apple プラットフォームで Firebase Cloud Messaging クライアント アプリを設定する

Apple クライアント アプリの場合、Firebase Cloud Messaging APNs インターフェースを介して最大 4,096 バイトの通知とデータ ペイロードを受信できます。

Objective-C または Swift でクライアント コードを記述するには、FIRMessaging API を使用することをおすすめします。クイックスタートの例では、両方の言語のサンプルコードが提供されています。

作業を開始する前に、Apple プロジェクトに Firebase を追加してください。

Firebase Cloud Messaging でのメソッドの実装入れ替え

FCM SDK は、FCM 登録トークンに対する APNs トークンのマッピングと、ダウンストリーム メッセージのコールバック処理中のアナリティクス データの取得という 2 つの主要領域で、メソッドの実装入れ替えを行います。入れ替えを使用しない場合、アプリの Info.plist ファイルにフラグ FirebaseAppDelegateProxyEnabled を追加し、これを NO(ブール値)に設定することによって、入れ替えを無効にできます。このガイドの関連領域には、メソッドの実装入れ替えを有効にした場合としない場合の両方のサンプルコードが記されています。

APNs 認証キーをアップロードする

APNs 認証キーを Firebase にアップロードします。まだ APNs 認証キーを用意していない場合は、Apple Developer Member Center で作成してください。

  1. Firebase コンソールのプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[Cloud Messaging] タブの順に選択します。

  2. [iOS アプリの構成] の下の [APNs 認証キー] で [アップロード] ボタンをクリックして、開発用認証キー、本番環境用認証キー、またはその両方をアップロードします。少なくとも 1 つ選択する必要があります。

  3. キーを保存した場所に移動し、キーを選択して [開く] をクリックします。キーのキー ID(Apple Developer Member Center で確認できます)を追加し、[アップロード] をクリックします。

リモート通知に登録する

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

Swift

UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Objective-C

[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

登録トークンにアクセスする

デフォルトでは、FCM SDK はアプリの起動時にクライアント アプリのインスタンスの登録トークンを生成します。APNs デバイス トークンの場合と同様に、このトークンを使用すると、ターゲットとする通知をアプリの特定のインスタンスに送信できます。

Apple プラットフォームが通常、アプリ起動時に APNs デバイス トークンを配信するのと同じ方法で、FCM は FIRMessagingDelegatemessaging:didReceiveRegistrationToken: メソッドによって登録トークンを提供します。FCM SDK は、アプリの初期起動時ならびにトークンが更新または無効化されるたびに、新規または既存のトークンを取得します。いずれの場合も、FCM SDK は有効なトークンを使用して messaging:didReceiveRegistrationToken: を呼び出します。

登録トークンは次のような場合に変更されることがあります。

  • アプリを新しいデバイスで復元した場合
  • ユーザーがアプリをアンインストール / 再インストールした場合
  • ユーザーがアプリのデータを消去する場合

メッセージング デリゲートを設定する

登録トークンを受信するには、メッセージング デリゲート プロトコルを実装し、[FIRApp configure] の呼び出し後に FIRMessagingdelegate プロパティを設定します。たとえば、アプリケーション デリゲートがメッセージング デリゲート プロトコルに準拠している場合は、application:didFinishLaunchingWithOptions: のデリゲートをそれ自体に設定できます。

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

現在の登録トークンを取得する

登録トークンは、メソッド messaging:didReceiveRegistrationToken: を使用して配信されます。このメソッドは通常、登録トークンを使用してアプリが起動するごとに 1 回ずつ呼び出されます。このメソッドが呼び出されるタイミングで、以下を実行できます。

  • 登録トークンが新規の場合、そのトークンをアプリケーション サーバーに送信します。
  • 登録トークンをトピックにサブスクライブします。これは新規サブスクリプションの場合、またはユーザーがアプリを再インストールした場合にのみ必要です。

token(completion:) を使用して直接トークンを取得できます。なんらかの形でトークンの取得に失敗すると、null 以外のエラーが返されます。

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];

このメソッドを使用することで、トークンを保管せずに、いつでもトークンにアクセスできます。

トークン更新のモニタリング

トークンが更新されるたびに通知を受けるには、メッセージング デリゲート プロトコルに準拠するデリゲートを指定します。次の例では、デリゲートを登録し、適切なデリゲート メソッドを追加します。

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")

  let dataDict: [String: String] = ["token": fcmToken ?? ""]
  NotificationCenter.default.post(
    name: Notification.Name("FCMToken"),
    object: nil,
    userInfo: dataDict
  )
  // TODO: If necessary send token to application server.
  // Note: This callback is fired at each app startup and whenever a new token is generated.
}

Objective-C

- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken {
    NSLog(@"FCM registration token: %@", fcmToken);
    // Notify about received token.
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:fcmToken forKey:@"token"];
    [[NSNotificationCenter defaultCenter] postNotificationName:
     @"FCMToken" object:nil userInfo:dataDict];
    // TODO: If necessary send token to application server.
    // Note: This callback is fired at each app startup and whenever a new token is generated.
}

別の方法として、デリゲート メソッドを提供する代わりに、kFIRMessagingRegistrationTokenRefreshNotification という名前の NSNotification をリッスンできます。トークン プロパティの値は常に現在のトークン値です。

実装入れ替えが無効な場合の APNs トークンと登録トークンとのマッピング

メソッドの実装入れ替えを無効にした場合や、SwiftUI アプリを作成している場合は、明示的に APNs トークンを FCM 登録トークンにマッピングする必要があります。application(_:didRegisterForRemoteNotificationsWithDeviceToken:) メソッドを実装して APNs トークンを取得し、MessagingapnsToken プロパティを設定します。

Swift

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken
}

Objective-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

FCM 登録トークンが生成されると、実装入れ替えを有効にしたときと同じメソッドを使用してトークンにアクセスし、更新イベントをリッスンできます。

自動初期化を禁止する

FCM 登録トークンが生成されると、ライブラリによりその ID と構成データが Firebase にアップロードされます。はじめにユーザーから明示的にオプトインする場合は、構成時に FCM を無効にしてトークンの生成を禁止できます。禁止するには、(GoogleService-Info.plist ではなく)Info.plist にメタデータ値を追加します。

FirebaseMessagingAutoInitEnabled = NO

FCM をもう一度有効にするには、ランタイム コールを実行します。

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

この値をいったん設定すると、アプリを再起動しても維持されます。

通知メッセージの送信

  1. 対象デバイスでアプリをインストールして実行します。Apple デバイスの場合、リモート通知受信権限に対するリクエストを承認します。
  2. アプリがデバイスのバックグラウンドで動作していることを確認します。
  3. Firebase コンソールで、[Messaging] ページを開きます。
  4. メッセージを初めて作成する場合は、[最初のキャンペーンを作成] を選択します。
    1. [Firebase Notification メッセージ] を選択し、[作成] を選択します。
  5. それ以外の場合は、[キャンペーン] タブで [新しいキャンペーンを作成]、[通知] の順に選択します。
  6. 通知テキストを入力します。
  7. 右側のペインで [テスト メッセージを送信] を選択します。
  8. [FCM 登録トークンを追加] というラベルの付いたフィールドに、登録トークンを入力します。
  9. [テスト] を選択します。

[テスト] を選択すると、アプリをバックグラウンドで実行しているターゲット クライアント デバイスに通知が届きます。

アプリへのメッセージ配信については、FCM レポート ダッシュボードをご覧ください。このダッシュボードには、Apple と Android のデバイスで送信および開封されたメッセージの数が記録されています。

次のステップ

Apple クライアントを設定したら、ユーザーとのメッセージの送受信を開始できます。