Firebase インストールの管理

Firebase インストール サービス(FIS)は、Firebase アプリのインストールされたインスタンスごとに Firebase インストール ID(FID)を提供します。Firebase インストール ID は、次の Firebase サービスで内部的に使用されます。

Firebase サービス Firebase インストール機能
Firebase Cloud Messaging

Firebase Cloud Messaging は、Firebase インストール ID を使用して、メッセージを配信するデバイスを特定します。

Firebase Crashlytics

Firebase Crashlytics は、アプリ インスタンスの Firebase インストール ID の変更に基づいて、Crashlytics インストール UUID をローテーションします。今後インストール ID は、クラッシュ レポートやクラッシュ管理サービスを強化する機能を有効にする際に使用される可能性があります。

Firebase In-App Messaging

Firebase In-App Messaging は、Firebase インストール ID を使用して、メッセージを配信するデバイスを特定します。

Firebase Performance Monitoring

Performance Monitoring は、Firebase インストール ID を使用して、ネットワーク リソースにアクセスする一意の Firebase インストールの数を計算します。その際にアクセス パターンの匿名性は十分に確保されます。Firebase Remote Config と連携し、Firebase インストール ID に基づいてパフォーマンス イベントの報告率を管理します。

Firebase Remote Config

Remote Config は、Firebase インストール ID を使用してエンドユーザーのデバイスに返す構成値を選択します。

Firebase ML

Firebase ML では、インストール認証トークンと呼ばれる認証情報を使用して、アプリ インスタンスを操作する際のデバイスの認証を行います(デベロッパー モデルをアプリ インスタンスに配布する場合など)。

Firebase User Segmentation Storage

Firebase User Segmentation Storage は、Firebase インストール ID、および関連する属性とセグメントを保存し、それらを使用する他の Firebase サービスにターゲティング情報を提供します。

通常、Firebase サービスで Firebase インストール サービスを使用する際には、デベロッパーは FIS API を直接呼び出す必要はありません。ただし、アプリデベロッパーが次のことを行うために、FIS API を直接呼び出す場合もあります。

  • Firebase インストールとインストールに関連するデータを削除する。
  • アプリの特定のインストールを対象にするために識別子(Firebase インストール ID)を取得する。
  • Firebase インストールを認証するためにインストール認証トークンを取得する。

FIS API の直接呼び出しを開始するには、SDK をアプリに追加します。

アプリに Firebase インストール SDK を追加する

iOS+

  1. Podfile に Firebase インストールの依存関係を追加します。
    pod 'FirebaseInstallations'
  2. pod install を実行し、作成された .xcworkspace ファイルを開きます。
  3. UIApplicationDelegateFirebaseCore モジュールと、アプリのデリゲートが使用する他の Firebase モジュールをインポートします。たとえば、Cloud FirestoreAuthentication を使用するには、次のように指定します。

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. アプリ デリゲートの application(_:didFinishLaunchingWithOptions:) メソッドで、FirebaseApp 共有インスタンスを構成します。

    SwiftUI

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. SwiftUI を使用している場合は、アプリケーション デリゲートを作成し、UIApplicationDelegateAdaptor または NSApplicationDelegateAdaptor を介して App 構造体に接続する必要があります。また、アプリ デリゲートのメソッドの実装入れ替えを無効にする必要があります。詳細については、SwiftUI の手順をご覧ください。

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

Android

Firebase インストール Android SDK の依存関係をモジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)に追加します。

implementation 'com.google.firebase:firebase-installations:18.0.0'

JavaScript

ウェブ アプリケーションのホスト方法によっては、構成が自動的に処理されない場合があります。その場合は、Firebase 構成オブジェクトの更新を手動で行う必要があります。

たとえば、依存関係を index.html に追加する場合は、<head> 要素に依存関係を追加します。

<script src="/__/firebase/11.0.2/firebase-installations.js"></script>

Flutter

  1. Flutter プロジェクトのルート ディレクトリから、次のコマンドを実行して Firebase インストール プラグインをインストールします。

    flutter pub add firebase_app_installations
    
  2. プロジェクトを再ビルドします。

    flutter run
    
  3. Firebase インストール プラグインをインポートします。

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Firebase インストールを削除する

Firebase インストールに関連付けられたデータは通常、個人を特定できるものではありません。それでも、このデータを管理、削除するオプションをユーザーに提供すると便利な場合があります。

Firebase インストール ID はアプリケーションのインストールごとに異なります。同じデバイス上にあったとしても、アプリケーションが異なると Firebase インストール ID も異なります。Firebase インストール ID は、アプリのインストールと、それらのアプリのインストールに関連するデータを識別します。

インストール ID を削除すると、そのインストール ID に関連付けられているデータは、Firebase インストール ID を使用してインストールを識別するすべての Firebase サービスのライブシステムとバックアップ システムから、180 日以内に削除されます。このプロセスの概要については、データの削除と保持に関する Google の方針説明をご覧ください。

アプリで FID 生成サービスをすべて無効にしない限り、FIS によって数日以内に新しい ID が作成されます。Firebase は、新しく作成された ID を新しい Firebase インストールであるとみなし、以前の ID やデータには関連付けません。

クライアント API 呼び出しで FID を削除する

Firebase サービスによって生成された FID を削除するには、Firebase インストール SDK から適切なメソッドを呼び出します。

Swift

do {
  try await Installations.installations().delete()
  print("Installation deleted");
} catch {
  print("Error deleting installation: \(error)")
}

Objective-C

[[FIRInstallations installations] deleteWithCompletion:^(NSError *error) {
   if (error != nil) {
     NSLog(@"Error deleting Installation %@", error);
     return;
   }
   NSLog(@"Installation deleted");
}];

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

サーバー API 呼び出しで FID を削除する

サーバー API 呼び出しで FID を削除するには、サーバーに Firebase Admin SDK を追加します(まだ追加していない場合)。

SDK を追加したら、選択した言語で削除処理の関数を呼び出すことで、FID を削除します(注: Node.js の場合を除いて、これらのメソッドの処理はインスタンス ID の命名に反映されます。ただし、どのメソッドも、現行のいずれかの Firebase SDK で呼び出しが行われた際に、実際に FID を削除します)。

Node.js

// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';

admin.installations().deleteInstallation(idToDelete);

Java

// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";

FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();

Python

  from firebase_admin import instance_id

  # An FID sent from a client service SDK
  id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'

  instance_id.delete_instance_id(id_to_delete)

Go

client, err := app.InstanceId(ctx)
if err != nil {
  log.Fatalln("error initializing client", err)
}

iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
  log.Fatalln("error deleting FID", err)
}

サーバー API 呼び出しにより Firebase インストール ID を削除すると、Firebase サービスはそのインストール ID に関連付けられているデータの削除プロセスを開始し、1~2 日でその ID に関する新しいデータの受け取りを停止して、ID が削除されたことをクライアント アプリに通知します。Firebase がクライアント アプリに通知するまで、アプリの一部のサービスは引き続き ID をターゲットにします。たとえば、Firebase インストールは数時間 FCM 通知を受信する場合があります。

現在の Firebase インストール ID を削除し、関連のない新しい ID で Firebase サービスをすぐに使用する場合は、クライアント API を使用して削除を処理します。

クライアント ID を取得する

アプリの特定のインストールを識別する必要がある場合は、Firebase インストール ID を取得して識別します。たとえば、BiqQuery インポート用にアプリ インストールのセグメントを作成したり、Firebase In-App Messaging の開発中にテストを行ったりするには、対応する Firebase インストール ID を使用して正しいデバイスを識別し、対象に設定します。

Firebase インストール ID を取得するには:

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

JavaScript

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

インストール認証トークンを取得する

Firebase サービスは、FIS から取得した認証トークンを使用して Firebase のインストールを認証できます。たとえば、Remote Config の A/B テストを設計する際は、インストール認証トークンを使用して対象のテストデバイスを認証できます。

インストール認証トークンは、有効時間が短い JSON Web Token(JWT)形式の署名なしトークンで、インストールに関する以下の情報が含まれます。

  • Firebase インストール ID
  • 関連付けられているプロジェクト(projectNumber
  • 関連付けられている Firebase アプリケーション ID(appId
  • トークンの有効期限

インストール認証トークンは取り消すことができず、有効期限まで有効です。トークンのデフォルト存続期間は 1 週間です。

インストール認証トークンを取得するには:

Swift

do {
  let result = try await Installations.installations()
    .authTokenForcingRefresh(true)
  print("Installation auth token: \(result.authToken)")
} catch {
  print("Error fetching token: \(error)")
}

Objective-C

[[FIRInstallations installations] authTokenForcingRefresh:true
                                               completion:^(FIRInstallationsAuthTokenResult *result, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation token %@", error);
    return;
  }
  NSLog(@"Installation auth token: %@", [result authToken]);
}];

Java

FirebaseInstallations.getInstance().getToken(/* forceRefresh */true)
        .addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if (task.isSuccessful() && task.getResult() != null) {
            Log.d("Installations", "Installation auth token: " + task.getResult().getToken());
        } else {
            Log.e("Installations", "Unable to get Installation auth token");
        }
    }
});

Kotlin

val forceRefresh = true
FirebaseInstallations.getInstance().getToken(forceRefresh)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Installations", "Installation auth token: " + task.result?.token)
        } else {
            Log.e("Installations", "Unable to get Installation auth token")
        }
    }

JavaScript

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

Firebase インストール ID のライフサイクルをモニタリングする

アプリの通常の動作において、Firebase インストール ID(FID)の特別なモニタリングは必要ありません。ただし、明示的に FID を取得して使用するアプリでは、FID の削除やローテーションをモニタリングするためのロジックを追加する必要があります。FID が削除またはローテーションされる可能性があるのは、次のような場合です。

  • アプリをアンインストールまたは再インストールした(エンドユーザーが新しいデバイスにインストールするときなど)。
  • エンドユーザーがアプリまたはデバイスのキャッシュをクリアした。
  • アプリが使用されていないことが原因で、バックエンドで FID の削除がトリガーされた(現在、このしきい値は 270 日間です)。

このようなケースで FID のローテーションや削除がアプリで行われた場合、新しい FID が割り当てられます。また、削除された FID に関連付けられていたインストール認証トークンは、有効期間に関係なく、新しいインストール認証トークンに置き換えられます。

アプリはこの変更をモニタリングし、適宜対応できます。

FID のローテーションをモニタリングするには:

Swift

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  Task {
    await self.fetchInstallationToken()
  }
}

Objective-C

__weak __auto_type weakSelf = self;
self.installationIDObserver = [[NSNotificationCenter defaultCenter]
        addObserverForName: FIRInstallationIDDidChangeNotification
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification * _Nonnull notification) {
    // Fetch new Installation ID
    [weakSelf fetchInstallationsID];
}];

新しい FID が割り当てられると、NSNotificationName.InstallationIDDidChange という名前の NSNotification がデフォルトの NSNotificationCenter に送信されます。

Android

Kotlin クライアントと Java クライアントには、新しい FID を取得するために、失敗した呼び出しに応答する再試行ロジックを追加する必要があります。

JavaScript

ウェブアプリは onIdChange フックをサブスクライブできます。

新しい FID が作成されると、サブスクライブしたコールバックがトリガーされます。

await firebase.installations().onIdChange((newId) => {
  console.log(newId);
  // TODO: Handle new installation ID.
});

Dart

FirebaseInstallations.instance.onIdChange.listen((token) {
  print('FID token: $token');
});

インスタンス ID から Firebase インストールへの移行

Firebase インストールを導入する前、Firebase ではインスタンス ID SDK を利用してアプリの個々のインストールを識別していました。Firebase インストールは、信頼性、パフォーマンス、セキュリティに関してインスタンス ID よりもはるかに優れています。インスタンス ID SDK を利用している Firebase アプリは、Firebase インストールに移行することをおすすめします。

移行プロセスはアプリによって異なります。

  • インスタンス ID API を直接呼び出していないアプリは、SDK のバージョンをアップデートすることで移行できます。ほとんどの Firebase アプリはこのカテゴリに含まれます。

  • インスタンス ID の API を明示的に呼び出しているアプリは、SDK のバージョンのアップデートに加えて、インスタンス ID のメソッドを Firebase インストールまたは FCM の同等のメソッドに置き換えるようコードを変更する必要があります。インスタンス ID を使用して FCM 登録トークンを取得している場合、またはアプリ インスタンスのターゲットや他の目的でインスタンス ID を明示的に使用している場合は、アプリケーション コードを更新する必要があります。

現在、FIS は以前の識別子である Firebase インスタンス ID と下位互換性があります。以下の Firebase SDK を使用している場合、データ削除をリクエストする別の方法として IID の削除があります。

  • iOS 6.14.0 以下
  • 2020 年 2 月 27 日より前の Android SDK

アプリを Firebase インストールに移行することは必須ではありませんが、移行を強くおすすめします。

Firebase インストールに対応した最小の SDK バージョンへのアップグレード

インスタンス ID から Firebase インストールに移行するには、以下に示す Firebase SDK の最小バージョン以上を使用する必要があります。

Firebase SDK Android の最小バージョン iOS の最小バージョン
Firebase Cloud Messaging v20.3.0 v6.34.0
Remote Config v19.2.0 v6.24.0
Firebase 向け Google アナリティクス (Measurement SDK) v17.4.4 v6.18.0
In-App Messaging v19.0.7 v6.24.0
Performance Monitoring v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
ML Kit v22.1.2 v6.28.0

インスタンス ID API を明示的に呼び出しているコードを更新する

Android または Apple のアプリでインスタンス ID SDK のメソッドを直接使用している場合は、Firebase インストール SDK または FCM SDK の同等の代替手段に置き換えることができます。

識別子の取得

インスタンス ID を取得するメソッドを、インストール ID を取得するメソッドに置き換えます。次に例を示します。

変更前

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)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration 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];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                Log.d("IID_TOKEN", task.getResult().getToken());
            }
        });

Kotlin

FirebaseInstanceId.getInstance().instanceId
        .addOnSuccessListener { result ->
            Log.d("IID_TOKEN", result.token)
        }

変更後

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

識別子の削除

インスタンス ID を削除するメソッドを、Firebase インストール ID を削除するメソッドに置き換えます。次に例を示します。

変更前

Swift

InstanceID.instanceID().deleteID { error in
  if let error = error {
    print("Error deleting instance ID: \(error)")
  }
}

Objective-C

[FIRInstanceID instanceID] deleteIDWithHandler:^(NSError *error) {
  if error != nil {
    NSLog(@"Error deleting instance ID: %@", error);
  }
}];

Android

FirebaseInstanceId.deleteInstanceId();

変更後

Swift

func delete(completion: @escaping (Error?) -> Void)

Objective-C

- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

FCM 登録トークンの取得

Firebase インストールを導入する前、FCM クライアントはインスタンス ID から登録トークンを取得していました。現在は、登録トークンを取得するためのメソッドが FCM SDK に用意されています。

変更前

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin

FirebaseInstanceId.getInstance().instanceId
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w(TAG, "getInstanceId failed", task.exception)
                return@OnCompleteListener
            }

            // Get new Instance ID token
            val token = task.result?.token

            // Log and toast
            val msg = getString(R.string.msg_token_fmt, token)
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        })

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)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration 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];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

変更後

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

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;
  }
}];