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

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

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

Метод Swizzling в Firebase Cloud Messaging

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

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

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

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

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

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

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

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

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

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

Быстрый


UNUserNotificationCenter.current().delegate = self

let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
  options: authOptions,
  completionHandler: { _, _ in }
)

application.registerForRemoteNotifications()

Цель-C


[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
    UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
    requestAuthorizationWithOptions:authOptions
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
      // ...
    }];

[application registerForRemoteNotifications];

Доступ к регистрационному токену

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

Точно так же, как платформы Apple обычно доставляют токен устройства APNs при запуске приложения, FCM предоставляет токен регистрации через метод messaging:didReceiveRegistrationToken: FIRMessagingDelegate . FCM SDK извлекает новый или существующий токен во время первоначального запуска приложения, а также всякий раз, когда токен обновляется или становится недействительным. Во всех случаях пакет SDK FCM вызывает messaging:didReceiveRegistrationToken: с действительным токеном.

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

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

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

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

Быстрый

Messaging.messaging().delegate = self

Цель-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)"
  }
}

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

Цель-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 и токена регистрации.

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

Быстрый

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken
}

Цель-C

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

После создания регистрационного токена FCM вы можете получить к нему доступ и прослушивать события обновления, используя те же методы, что и при включенном режиме Swizzling.

Запретить автоматическую инициализацию

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

FirebaseMessagingAutoInitEnabled = NO

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

Быстрый

Messaging.messaging().autoInitEnabled = true

Цель-C

[FIRMessaging messaging].autoInitEnabled = YES;

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

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

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