Настройте клиентское приложение Firebase Cloud Messaging на платформах Apple.

Для клиентских приложений Apple вы можете получать уведомления и полезные данные объемом до 4096 байт через интерфейс APNs Firebase Cloud Messaging .

Для написания клиентского кода на Objective-C или Swift мы рекомендуем использовать API FIRMessaging . В кратком руководстве представлены примеры кода для обоих языков.

Изменение методов в Firebase Cloud Messaging

FCM SDK выполняет подмену методов в двух ключевых областях: сопоставление вашего токена APNs с токеном регистрации FCM и сбор аналитических данных во время обработки обратных вызовов сообщений . Разработчики, предпочитающие не использовать подмену, могут отключить её, добавив флаг FirebaseAppDelegateProxyEnabled в файл Info.plist приложения и установив его в значение NO (логическое значение). В соответствующих разделах руководств приведены примеры кода как с подменой методов, так и без неё.

Добавьте Firebase в свой проект Apple

Если вы еще этого не сделали, добавьте Firebase в свой проект Apple .

Загрузите свой ключ аутентификации APNs

Загрузите свой ключ аутентификации APNs в Firebase. Если у вас ещё нет ключа аутентификации APNs, обязательно создайте его в Центре разработчиков Apple .

  1. Внутри вашего проекта в консоли Firebase выберите значок шестеренки, выберите Настройки проекта , а затем выберите вкладку Облачные сообщения .

  2. В разделе «Ключ аутентификации APNs» в настройках приложения iOS нажмите кнопку «Загрузить» .

  3. Перейдите к месту сохранения ключа, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре разработчиков Apple ) и нажмите «Загрузить» .

Зарегистрируйтесь для получения удаленных уведомлений

Зарегистрируйте приложение для получения удалённых уведомлений при запуске или в нужном месте в потоке работы приложения. Вызовите registerForRemoteNotifications , как показано ниже:

Быстрый

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 предоставляет токен регистрации через messaging:didReceiveRegistrationToken: класса FIRMessagingDelegate . FCM SDK извлекает новый или существующий токен при первом запуске приложения, а также при каждом обновлении или аннулировании токена. Во всех случаях FCM SDK вызывает messaging:didReceiveRegistrationToken: с действительным токеном.

Регистрационный токен может измениться в следующих случаях:

  • Приложение восстановлено на новом устройстве.
  • Пользователь удаляет/переустанавливает приложение
  • Пользователь очищает данные приложения.

Установить делегата обмена сообщениями

Чтобы получать регистрационные токены, реализуйте протокол делегата обмена сообщениями и установите свойство delegate FIRMessaging после вызова [FIRApp configure] . Например, если ваш делегат приложения соответствует протоколу делегата обмена сообщениями, вы можете установить делегат в application:didFinishLaunchingWithOptions: на самого себя.

Быстрый

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

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

Регистрационные токены доставляются методом messaging:didReceiveRegistrationToken: Этот метод обычно вызывается один раз при запуске приложения с регистрационным токеном. Вызов этого метода — идеальный момент для:

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

Вы можете получить токен напрямую, используя token(completion:) . Если получение токена по какой-либо причине не удалось, возвращается ненулевая ошибка.

Быстрый

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

Вы можете использовать этот метод в любое время для доступа к токену вместо его хранения.

Обновление токена монитора

Чтобы получать уведомления об обновлении токена, предоставьте делегат, соответствующий протоколу делегата обмена сообщениями. В следующем примере делегат регистрируется и добавляется соответствующий метод делегата:

Быстрый

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

В качестве альтернативы вы можете прослушивать NSNotification с именем kFIRMessagingRegistrationTokenRefreshNotification вместо предоставления метода делегата. Свойство token всегда содержит текущее значение токена.

Swizzling отключен: сопоставление вашего токена APN и регистрационного токена

Если вы отключили функцию «swizzling» методов или разрабатываете приложение SwiftUI, вам необходимо явно сопоставить свой токен APNs с токеном регистрации FCM . Реализуйте метод application(_:didRegisterForRemoteNotificationsWithDeviceToken:) для получения токена APNs, а затем задайте свойство apnsToken для Messaging :

Быстрый

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 библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите сначала получить явное согласие пользователей, вы можете запретить генерацию токена во время настройки, отключив FCM. Для этого добавьте значение метаданных в файл Info.plist (а не в GoogleService-Info.plist ):

FirebaseMessagingAutoInitEnabled = NO

Чтобы повторно включить FCM, можно выполнить вызов во время выполнения:

Быстрый

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

После установки это значение сохраняется при перезапуске приложения.

Следующие шаги

После настройки клиента Apple вы готовы добавить обработку сообщений и другие, более сложные функции в своё приложение. Подробнее см. в этих руководствах: