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

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

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

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

Firebase Crashlytics

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, не требуя от разработчиков прямого взаимодействия с FIS API. Однако бывают случаи, когда разработчики приложений могут напрямую вызывать 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 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 . Вы также должны отключить swizzling делегата приложения. Дополнительные сведения см. в инструкциях SwiftUI .

    SwiftUI

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

Андроид

Добавьте зависимость для установки Firebase Android SDK в файл Gradle вашего модуля (на уровне приложения) (обычно app/build.gradle ):

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

JavaScript

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

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

<script src="/__/firebase/9.22.2/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:

Быстрый

Installations.installations().delete { error in
  if let error = error {
    print("Error deleting installation: \(error)")
    return
  }
  print("Installation deleted");
}

Цель-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 SDK).

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. Например, чтобы выполнить тестирование во время разработки Firebase In-App Messaging, вы можете определить и выбрать правильное тестовое устройство, используя его идентификатор установки Firebase.

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

Быстрый

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

Цель-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 )
  • Срок действия токена

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

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

Быстрый

Installations.installations().authTokenForcingRefresh(true, completion: { (result, error) in
  if let error = error {
    print("Error fetching token: \(error)")
    return
  }
  guard let result = result else { return }
  print("Installation auth token: \(result.authToken)")
})

Цель-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, удаляется независимо от срока его действия и заменяется новым токеном проверки подлинности установки.

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

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

Быстрый

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  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');
});

Переход с Instance ID на установки Firebase

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

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

  • Приложения, которые напрямую не вызывают API-интерфейсы Instance ID, можно перенести, обновив свои версии 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:

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

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

Если ваше приложение Android или Apple напрямую использует методы SDK Instance ID, вы можете заменить это использование идентичными альтернативами в 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)
        }

После

Быстрый

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

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