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

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

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

Переключение методов в Firebase Cloud Messaging

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

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

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

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

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

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

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

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

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

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

Быстрый

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ in }
  )
} else {
  let settings: UIUserNotificationSettings =
    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Цель-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

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

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

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

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