| Выберите платформу: | iOS+ Android Web Flutter Unity C++ |
В этом руководстве описано, как начать работу с Firebase Cloud Messaging в клиентских приложениях для платформы Apple (например, iOS), чтобы вы могли надежно отправлять сообщения.
Для клиентских приложений Apple вы можете получать уведомления и данные объемом до 4096 байт через интерфейс APNs Firebase Cloud Messaging .
Для написания клиентского кода на Objective-C или Swift мы рекомендуем использовать API FIRMessaging . В примере быстрого запуска представлен образец кода для обоих языков.
Прежде чем начать, добавьте Firebase в свой проект Apple .
Подмена методов в Firebase Cloud Messaging
SDK FCM выполняет подмену методов в двух ключевых областях: сопоставление токена APNs с идентификатором установки Firebase или токеном регистрации FCM и сбор аналитических данных во время обработки обратных вызовов сообщений . Разработчики, которые предпочитают не использовать подмену методов, могут отключить её, добавив флаг FirebaseAppDelegateProxyEnabled в файл Info.plist приложения и установив для него логическое значение NO . В соответствующих разделах руководств приведены примеры кода как с включенной, так и с выключенной подменой методов.
Загрузите ключ аутентификации APNs.
Загрузите свой ключ аутентификации APNs в Firebase. Если у вас еще нет ключа аутентификации APNs, обязательно создайте его в Центре разработчиков Apple .
- В консоли Firebase перейдите по адресу
> Общие . Затем перейдите на вкладку «Облачные сообщения» . - В разделе «Ключ аутентификации APNs» в настройках приложения iOS нажмите «Загрузить» , чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба. Требуется как минимум один ключ.
- Перейдите к месту, где вы сохранили свой ключ, выберите его и нажмите «Открыть» . Добавьте идентификатор ключа (доступен в Центре для разработчиков 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];
Получите доступ к идентификатору установки Firebase.
По умолчанию SDK FCM регистрирует экземпляр приложения в FCM и возвращает идентификатор установки Firebase (FID) для экземпляра клиентского приложения при запуске приложения. Подобно токену устройства APNs, этот FID позволяет отправлять целевые уведомления любому конкретному экземпляру вашего приложения.
Подобно тому, как платформы Apple обычно предоставляют токен устройства APNs при запуске приложения, FCM предоставляет FID для таргетирования уведомлений. SDK FCM предоставляет FID с помощью messaging:didReceiveRegistration: класса FIRMessagingDelegate , автоматически отслеживает изменения FID и вызывает метод с новым FID при обнаружении изменения. Мы рекомендуем регулярно получать и загружать FID, поскольку FID может меняться после первоначального запуска.
Включите регистрацию с использованием идентификатора установки Firebase.
Чтобы включить регистрацию экземпляра вашего приложения в FCM с использованием идентификатора установки Firebase (FID) , добавьте следующий флаг метаданных в файл Info.plist , а не в файл GoogleService-Info.plist :
FirebaseMessagingInstallationIdEnabled = YES
Установить делегата обмена сообщениями
Для получения FID-идентификаторов реализуйте протокол делегата обмена сообщениями и установите свойство delegate объекта FIRMessaging после вызова [FIRApp configure] . Например, если ваш делегат приложения соответствует протоколу делегата обмена сообщениями, вы можете установить делегат в application:didFinishLaunchingWithOptions: на самого себя.
Быстрый
Messaging.messaging().delegate = self
Objective-C
[FIRMessaging messaging].delegate = self;
Реализуйте метод didReceiveRegistration
После завершения регистрации экземпляры приложения получают FID (идентификатор приложения). Чтобы получить FID при регистрации, реализуйте метод messaging:didReceiveRegistration: Этот метод обычно вызывается один раз при каждом запуске приложения с указанием FID. При вызове этого метода можно выполнить следующие действия:
- Если вы не отправляли FID на свой сервер или отправляли FID недавно, отправьте его на сервер приложений.
- Если подписка новая или пользователь переустановил приложение, подпишите FID на темы.
Быстрый
func messaging(_ messaging: Messaging, didReceiveRegistration installationId: String?) { print("Firebase Installation ID: \(String(describing: installationId))") // Note: This callback is fired at each app startup. if let installationId = installationId { // Send the Firebase Installation ID to your app server. sendRegistrationToServer(installationId) } }
Objective-C
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistration:(nullable NSString *)installationId { NSLog(@"Firebase Installation ID: %@", installationId); // Note: This callback is fired at each app startup. if (installationId != nil) { // Send the Firebase Installation ID to your app server. [self sendRegistrationToServer:installationId]; } }
При отключенной автоматической инициализации регистрировать вручную.
Если вы отключили автоматическую инициализацию, SDK FCM не будет автоматически регистрировать экземпляр приложения в FCM при запуске приложения. Для запуска регистрации и доставки FID через messaging:didReceiveRegistration: необходимо вызвать метод register при запуске приложения.
Быстрый
// Trigger manual registration if auto-initialization is turned off. Messaging.messaging().register { error in if let error = error { // Handle the error print("Failed registering: \(error)") return } // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method. print("Successfully registered.") }
Objective-C
// Trigger manual registration if auto-initialization is turned off. [[FIRMessaging messaging] registerWithCompletion:^(NSError * _Nullable error) { if (error) { // Handle the error NSLog(@"Failed registering: %@", error); return; } // Registration was successful. FID is delivered through the messaging:didReceiveRegistration: method. NSLog(@"Successfully registered."); }];
Подмена пользовательских настроек отключена: сопоставление токена APNs и FID.
Если вы отключили подмену методов или разрабатываете приложение SwiftUI, вам необходимо явно сопоставить ваш токен APNs с идентификаторами установки Firebase (FID). Реализуйте метод 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; }
После регистрации FID вы можете получить к нему доступ и отслеживать события обновления, используя те же методы, что и при включенной функции переадресации транзакций (swizzling).
Получите доступ к регистрационному токену.
По умолчанию SDK FCM генерирует регистрационный токен для экземпляра клиентского приложения при запуске приложения. Подобно токену устройства APNs, этот токен позволяет отправлять целевые уведомления любому конкретному экземпляру вашего приложения.
Подобно тому, как платформы Apple обычно предоставляют токен устройства APNs при запуске приложения, FCM предоставляет токен регистрации через метод messaging:didReceiveRegistrationToken: класса FIRMessagingDelegate . SDK FCM получает новый или существующий токен при первом запуске приложения, а также всякий раз, когда токен обновляется или становится недействительным. Во всех случаях SDK FCM вызывает 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 remote FCM registration token: \(error)") } else if let token = token { print("Remote instance ID token: \(token)") } }
Objective-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]; // display message NSLog(@"%@", message); } }];
Этот метод можно использовать в любое время для доступа к токену вместо его сохранения.
Обновление токена монитора
Чтобы получать уведомления об обновлении токена, предоставьте делегат, соответствующий протоколу делегатов сообщений. В следующем примере регистрируется делегат и добавляется соответствующий метод делегата:
Быстрый
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { print("Firebase registration token: \(String(describing: fcmToken))") // 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 всегда содержит текущее значение токена.
Функция переадресации запросов отключена: сопоставление токена APNs и регистрационного токена.
Если вы отключили подмену методов или разрабатываете приложение 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 вы можете получить к нему доступ и отслеживать события обновления, используя те же методы, что и при включенной функции переадресации транзакций (swizzling).
Предотвратить автоматическую инициализацию
При создании регистрации FCM библиотека загружает идентификатор и данные конфигурации в Firebase. Если вы хотите сначала получить явное согласие пользователей, вы можете предотвратить автоматическую регистрацию на этапе настройки, отключив FCM. Для этого добавьте значение метаданных в ваш Info.plist (не в ваш GoogleService-Info.plist ):
FirebaseMessagingAutoInitEnabled = NO
Для повторного включения FCM можно выполнить вызов во время выполнения:
Быстрый
Messaging.messaging().autoInitEnabled = true
Objective-C
[FIRMessaging messaging].autoInitEnabled = YES;
После установки это значение сохраняется при перезапуске приложения.
Настройте расширение службы уведомлений.
Для отправки уведомлений с изображениями на устройства Apple необходимо добавить расширение службы уведомлений. Это расширение позволяет устройствам отображать изображения, содержащиеся в содержимом уведомления. Если вы не планируете отправлять изображения в уведомлениях, этот шаг можно пропустить.
Чтобы добавить расширение сервиса, выполните необходимые задачи настройки для изменения и отображения уведомлений в APN, а затем добавьте API-интерфейс вспомогательного средства расширения FCM в NotificationService.m . В частности, вместо завершения обратного вызова с помощью self.contentHandler(self.bestAttemptContent); завершите его с помощью FIRMessaging extensionHelper как показано ниже:
@interface NotificationService () <NSURLSessionDelegate>
@property(nonatomic) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property(nonatomic) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
// Modify the notification content here as you want
self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]",
self.bestAttemptContent.title];
// Call FIRMessaging extension helper API.
[[FIRMessaging extensionHelper] populateNotificationContent:self.bestAttemptContent
withContentHandler:contentHandler];
}
...
Отправить уведомление
Установите и запустите приложение на целевом устройстве. На устройствах Apple примите запрос на разрешение получения удаленных уведомлений.
Убедитесь, что приложение запущено в фоновом режиме на устройстве.
В консоли Firebase перейдите в раздел DevOps & Engagement > Messaging.
Создайте кампанию.
Если это ваше первое сообщение:
Выберите «Создать свою первую кампанию» .
Выберите сообщения Firebase Notification и нажмите «Создать» .
Если вы ранее создавали кампании:
На вкладке «Кампании» выберите «Новая кампания» .
Нажмите «Уведомления» .
Введите текст сообщения.
В правой панели выберите пункт «Отправить тестовое сообщение» .
В поле с надписью «Добавить идентификатор установки Firebase или токен регистрации FCM введите свой токен регистрации.
Выберите тест .
После выбора пункта «Тест» целевое клиентское устройство, на котором приложение работает в фоновом режиме, должно получить уведомление.
Чтобы получить представление о доставке сообщений в ваше приложение, перейдите на панель мониторинга DevOps & Engagement > Messaging > Reports в консоли Firebase . На этой панели мониторинга отображается количество отправленных и открытых сообщений на устройствах Apple и Android, а также данные о «показах» (уведомлениях, увиденных пользователями) для приложений Android.
Следующие шаги
После завершения этапов настройки, вот несколько вариантов для дальнейшей работы с FCM для платформ Apple:
- Отправляйте сообщения на устройства
- Получайте сообщения в приложении Apple.
- Отправляйте сообщения по темам