Apple プラットフォーム アプリで Firebase Cloud Messaging を使ってみる

プラットフォームを選択: iOS+ Android Web Flutter Unity C++


このガイドでは、メッセージを確実に送信できるように、Apple プラットフォーム(iOS など)のクライアント アプリで 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 remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error fetching the remote FCM registration token: %@", error);
  } else {
    NSLog(@"Remote FCM registration token: %@", token);
    NSString* message =
      [NSString stringWithFormat:@"FCM registration token: %@", token];
    // display message
    NSLog(@"%@", message);
  }
}];

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

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

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

Swift

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
  print("Firebase registration token: \(String(describing: fcmToken))")
  // 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;

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

通知サービス拡張を設定する

画像を含む通知を Apple デバイスに送信するには、通知サービス拡張機能を追加する必要があります。この拡張機能により、通知ペイロードで配信された画像をデバイスで表示できるようになります。通知で画像を送信する予定がない場合は、この手順を省略できます。

サービス拡張を追加するには、APNs で通知を変更して表示するために必要な設定作業を行ってから、NotificationService.m に FCM 拡張ヘルパー API を追加します。具体的には、self.contentHandler(self.bestAttemptContent); でコールバックを完了するのではなく、以下のように FIRMessaging extensionHelper で完了します。

@interface NotificationService () <NSURLSessionDelegate>
@property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property(nonatomic) UNMutableNotificationContent *bestAttemptContent;
@end

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    // Modify the notification content here as you want
    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]",
    self.bestAttemptContent.title];

  // Call FIRMessaging extension helper API.
  [[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
                                            withContentHandler:contentHandler];

}
...

通知メッセージの送信

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

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

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

次のステップ

設定手順の完了後、Apple プラットフォーム用 FCM で開発を進めるための方法をいくつか次に示します。