Управление установками Firebase

Служба установки Firebase (FIS) предоставляет идентификатор установки Firebase (FID) для каждого установленного экземпляра приложения Firebase. Идентификатор установки Firebase используется внутри этих служб Firebase:

Служба Firebase Функциональность установки Firebase
Облачный обмен сообщениями Firebase

Firebase Cloud Messaging использует идентификаторы установки Firebase для целевых устройств для доставки сообщений.

Firebase Крашлитикс

Firebase Crashlytics меняет UUID установки Crashlytics на основе изменений идентификатора установки экземпляра приложения Firebase. В будущем идентификатор установки может использоваться для включения функций, улучшающих службы отчетов о сбоях и управления сбоями.

Обмен сообщениями Firebase внутри приложения

Firebase In-App Messaging использует идентификаторы установки Firebase для целевых устройств для доставки сообщений.

Мониторинг производительности Firebase

Мониторинг производительности использует идентификаторы установки Firebase для расчета количества уникальных установок Firebase, имеющих доступ к сетевым ресурсам, чтобы гарантировать достаточную анонимность шаблонов доступа. Он также использует идентификаторы установки Firebase с Firebase Remote Config для управления частотой отчетов о событиях производительности.

Удаленная конфигурация Firebase

Remote Config использует идентификаторы установки Firebase для выбора значений конфигурации для возврата на устройства конечных пользователей.

Firebase ML

Учетные данные, называемые токенами аутентификации установки , используются Firebase ML для аутентификации устройства при взаимодействии с экземплярами приложения, например, для распространения моделей разработчика по экземплярам приложения.

Хранилище сегментации пользователей Firebase

В хранилище сегментации пользователей Firebase хранятся идентификаторы установки Firebase, а также связанные атрибуты и сегменты для предоставления информации о таргетинге другим службам Firebase, которые их используют.

Обычно службы Firebase используют службу установки Firebase, не требуя от разработчиков прямого взаимодействия с API FIS. Однако в некоторых случаях разработчикам приложений может потребоваться прямой вызов FIS API, например:

  • Чтобы удалить установку Firebase и данные, связанные с ней.
  • Чтобы получить идентификаторы (идентификаторы установки Firebase), чтобы настроить таргетинг на определенные установки приложений.
  • Чтобы получить токены аутентификации установки для аутентификации установок Firebase.

Чтобы начать работу с прямым вызовом FIS API, добавьте SDK в свое приложение.

Добавьте SDK для установки Firebase в свое приложение.

iOS+

  1. Добавьте зависимость для установок Firebase в свой подфайл:
    pod 'FirebaseInstallations'
  2. Запустите pod install и откройте созданный файл .xcworkspace .
  3. Импортируйте модуль FirebaseCore в свой UIApplicationDelegate , а также любые другие модули Firebase, которые использует ваш делегат приложения. Например, чтобы использовать Cloud Firestore и аутентификацию:

    SwiftUI

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

    Быстрый

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Цель-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Настройте общий экземпляр FirebaseApp в методе application(_:didFinishLaunchingWithOptions:) делегата вашего приложения:

    SwiftUI

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

    Быстрый

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

    Цель-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. Если вы используете SwiftUI, вам необходимо создать делегат приложения и прикрепить его к структуре вашего App через UIApplicationDelegateAdaptor или NSApplicationDelegateAdaptor . Вы также должны отключить переключение делегатов приложений. Дополнительную информацию смотрите в инструкциях 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 SDK Firebase в файл Gradle вашего модуля (на уровне приложения) (обычно app/build.gradle ):

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

JavaScript

В зависимости от того, как размещено ваше веб-приложение, ваша конфигурация может обрабатываться автоматически или вам может потребоваться обновить объект конфигурации Firebase .

Например, если ваши зависимости добавлены в index.html, добавьте зависимость в элемент <head>:

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

трепетать

  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 различны для каждой установки каждого приложения; разные приложения на одном устройстве имеют разные идентификаторы установки Firebase. Идентификаторы установки Firebase идентифицируют установки приложений и данные, связанные с этими установками приложений.

Когда вы удаляете идентификатор установки, данные, привязанные к этому идентификатору установки, удаляются из действующих и резервных систем всех сервисов Firebase, которые используют идентификаторы установки Firebase для идентификации установок, в течение 180 дней. Этот процесс подробно описан в заявлении Google об удалении и сохранении .

Если вы не отключите все службы, генерирующие FID, в своем приложении, FIS создаст новый идентификатор в течение нескольких дней. Firebase считает вновь созданный идентификатор новой установкой Firebase и никак не связывает его с предыдущим идентификатором или данными.

Удаление FID с помощью вызова клиентского API

Чтобы удалить FID, созданные службами Firebase, вызовите соответствующий метод из установочного SDK Firebase:

Быстрый

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

Цель-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+KTX

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();

Удаление FID с помощью вызова API сервера

Чтобы удалить FID с помощью вызова API сервера, добавьте Firebase Admin SDK на свой сервер , если вы еще этого не сделали.

После добавления SDK удалите FID с помощью вызова функции удаления на выбранном вами языке (примечание: за исключением Node.js, эти методы отражают именование идентификатора экземпляра. Однако все они фактически удаляют FID при вызове с любым текущим Firebase). СДК).

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();

Питон

  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)

Идти

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)
}

Когда вы удаляете идентификатор установки Firebase с помощью вызова API сервера, службы Firebase запускают процесс удаления данных, связанных с этим идентификатором установки, прекращают принимать новые данные для этого идентификатора в течение 1–2 дней, а затем уведомляют клиентское приложение. что идентификатор был удален. Пока Firebase не уведомит клиентское приложение, некоторые службы приложения могут по-прежнему ориентироваться на этот идентификатор — например, установка Firebase может продолжать получать уведомления FCM в течение нескольких часов.

Если вы хотите удалить текущий идентификатор установки Firebase и немедленно использовать службы Firebase с новым несвязанным идентификатором, используйте клиентский API для обработки удаления.

Получить идентификаторы клиентов

Если вам необходимо идентифицировать конкретные установки вашего приложения, вы можете сделать это, получив идентификатор установки Firebase. Например, чтобы создать сегменты установок приложения для импорта BiqQuery или выполнить тестирование во время разработки Firebase In-App Messaging, вы можете определить и настроить таргетинг на правильные устройства, используя соответствующие идентификаторы установки Firebase.

Чтобы получить идентификатор установки Firebase:

Быстрый

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

Цель-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+KTX

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 могут аутентифицировать установки Firebase с помощью токенов аутентификации, полученных из FIS. Например, при разработке A/B-тестов для Remote Config вы можете аутентифицировать целевое тестовое устройство с помощью токена аутентификации установки.

Токен аутентификации установки — это кратковременный токен носителя в формате веб-токена JSON (JWT), содержащий следующую информацию для установки:

  • Идентификатор установки Firebase
  • Связанный проект ( projectNumber )
  • Связанный идентификатор приложения Firebase ( appId ).
  • Срок действия токена

Токен аутентификации установки не может быть отозван и остается действительным до истечения срока его действия. Срок действия токена по умолчанию составляет одну неделю.

Чтобы получить токен аутентификации установки:

Быстрый

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

Цель-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+KTX

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

Во время нормальной работы приложения идентификаторы установки Firebase (FID) не требуют специального мониторинга. Однако приложения, которые явно извлекают и используют FID, должны добавить логику для отслеживания потенциального удаления или ротации FID. Вот несколько случаев, когда FID можно удалить или повернуть:

  • Удаление или переустановка приложения, например, когда конечный пользователь устанавливает его на новое устройство.
  • Конечный пользователь очищает кеш приложения или устройства.
  • Удаление FID запускается на серверной стороне из-за неактивности приложения (в настоящее время пороговое значение для этого составляет 270 дней бездействия).

Когда в таких случаях приложения подвергаются ротации или удалению FID, им назначается новый FID. Кроме того, токен проверки подлинности установки, связанный с удаленным FID, удаляется независимо от его срока действия и заменяется новым токеном проверки подлинности установки.

Приложения могут отслеживать эти изменения и реагировать соответствующим образом.

Чтобы контролировать вращение ПИД:

Быстрый

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

Цель-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];
}];

NSNotification с именем NSNotificationName.InstallationIDDidChange публикуется в NSNotificationCenter по умолчанию всякий раз, когда назначается новый FID.

Андроид

Клиенты 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');
});

Миграция с идентификатора экземпляра на установки Firebase

До появления установок Firebase Firebase использовала SDK Instance ID для идентификаторов установок приложений. Установки Firebase обеспечивают значительные преимущества перед Instance ID в надежности, производительности и безопасности. Приложения Firebase, зависящие от SDK идентификатора экземпляра, следует перенести на установки Firebase.

Процесс миграции зависит от вашего приложения:

  • Приложения, которые не вызывают напрямую API-интерфейсы идентификатора экземпляра, можно перенести, обновив версии своих SDK . Большинство приложений Firebase попадают в эту категорию.

  • Приложения, которые явно выполняют вызовы API к идентификатору экземпляра, должны обновить версии SDK и внести изменения в код , чтобы заменить методы идентификатора экземпляра их установками Firebase или эквивалентами FCM. Если ваше приложение использует идентификатор экземпляра для получения токенов регистрации FCM или явно использует идентификатор экземпляра для нацеливания на экземпляры приложения или для любых других целей, вам необходимо обновить код приложения.

В настоящее время FIS обратно совместим с устаревшим идентификатором Firebase Instance ID. Удаление IID — это альтернативный метод запроса удаления данных с помощью следующих SDK Firebase:

  • iOS 6.14.0 и ниже
  • Android SDK, выпущенные ранее 27 февраля 2020 г.

Это означает, что приложениям не требуется мигрировать на установки Firebase; однако это настоятельно рекомендуется.

Обновление до минимальных версий SDK для установок Firebase

Чтобы перейти с Instance ID на установки Firebase, убедитесь, что ваши приложения используют по крайней мере указанные минимальные номера версий следующих Firebase SDK:

Firebase SDK Минимальная версия Android Минимальная версия iOS
Облачный обмен сообщениями Firebase v20.3.0 v6.34.0
Удаленная настройка v19.2.0 v6.24.0
Google Analytics для Firebase \ (SDK для измерения) v17.4.4 v6.18.0
Обмен сообщениями в приложении v19.0.7 v6.24.0
Мониторинг производительности v19.0.8 v6.21.0
Крашлитикс v17.2.1 v6.23.0
ML-комплект v22.1.2 v6.28.0

Обновление кода, который явно вызывает API идентификатора экземпляра.

Если ваше приложение Android или Apple напрямую использует методы Instance ID SDK, вы можете заменить это использование идентичными альтернативами в установочном SDK Firebase или FCM SDK.

Получение идентификатора

Методы получения идентификаторов экземпляров заменены методами получения идентификатора установки. Например:

До

Быстрый

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)"
  }
}

Цель-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+KTX

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

После

Быстрый

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

Цель-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+KTX

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

Удаление идентификатора

Методы удаления идентификаторов экземпляров заменяются методами удаления идентификаторов установки Firebase. Например:

До

Быстрый

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

Цель-C

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

Андроид

FirebaseInstanceId.deleteInstanceId();

После

Быстрый

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

Цель-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+KTX

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

Получение регистрационного токена FCM

До появления Firebase Installations клиенты FCM получали регистрационные токены из идентификатора экземпляра. Теперь 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+KTX

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()
        })

Быстрый

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)"
  }
}

Цель-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+KTX

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()
})

Быстрый

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)"
  }
}

Цель-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;
  }
}];