| Выберите платформу: | 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.
By default, the FCM SDK registers the app instance with FCM and returns a Firebase Installation ID (FID) for the client app instance on app launch. Similar to the APNs device token, this FID allows you to send targeted notifications to any particular instance of your app.
Подобно тому, как платформы 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
Установить делегата обмена сообщениями
To receive FIDs, implement the messaging delegate protocol and set the delegate property of FIRMessaging after calling [FIRApp configure] . For example, if your application delegate conforms to the messaging delegate protocol, you can set the delegate on application:didFinishLaunchingWithOptions: to itself.
Быстрый
Messaging.messaging().delegate = self
Objective-C
[FIRMessaging messaging].delegate = self;
Реализуйте метод didReceiveRegistration
App instances are targeted using the FID once registration completes. To receive the FID upon registration, implement the messaging:didReceiveRegistration: method. This method is typically invoked once per app startup with the FID. When this method is called, you can perform the following actions:
- Если вы не отправляли 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]; } }
При отключенной автоматической инициализации регистрировать вручную.
If you have disabled auto-initialization, the FCM SDK won't automatically register the app instance with FCM at app startup. You must call register on app startup to trigger registration and FID delivery through the messaging:didReceiveRegistration: method:
Быстрый
// 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.
If you've disabled method swizzling or you're building a SwiftUI app, you must explicitly map your APNs token to the Firebase Installation IDs (FID). Implement the application(_:didRegisterForRemoteNotificationsWithDeviceToken:) method to retrieve the APNs token, and then set the apnsToken property of 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).
Получите доступ к регистрационному токену.
By default, the FCM SDK generates a registration token for the client app instance on app launch. Similar to the APNs device token, this token allows you to send targeted notifications to any particular instance of your app.
Подобно тому, как платформы Apple обычно предоставляют токен устройства APNs при запуске приложения, FCM предоставляет токен регистрации через метод messaging:didReceiveRegistrationToken: класса FIRMessagingDelegate . SDK FCM получает новый или существующий токен при первом запуске приложения, а также всякий раз, когда токен обновляется или становится недействительным. Во всех случаях SDK FCM вызывает messaging:didReceiveRegistrationToken: с действительным токеном.
Регистрационный токен может измениться в следующих случаях:
- Приложение восстановлено на новом устройстве.
- Пользователь удаляет/переустанавливает приложение.
- Пользователь очищает данные приложения.
Установить делегата обмена сообщениями
To receive registration tokens, implement the messaging delegate protocol and set FIRMessaging 's delegate property after calling [FIRApp configure] . For example, if your application delegate conforms to the messaging delegate protocol, you can set the delegate on application:didFinishLaunchingWithOptions: to itself.
Быстрый
Messaging.messaging().delegate = self
Objective-C
[FIRMessaging messaging].delegate = self;
Получение текущего регистрационного токена
Registration tokens are delivered via the method messaging:didReceiveRegistrationToken: . This method is called generally once per app start with registration token. When this method is called, it is the ideal time to:
- Если регистрационный токен новый, отправьте его на сервер вашего приложения.
- Подпишите регистрационный токен на темы. Это необходимо только для новых подписок или в случаях, когда пользователь переустановил приложение.
Вы можете получить токен напрямую, используя 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. }
Alternatively, you can listen for an NSNotification named kFIRMessagingRegistrationTokenRefreshNotification rather than supplying a delegate method. The token property always has the current token value.
Функция переадресации запросов отключена: сопоставление токена APNs и регистрационного токена.
If you have disabled method swizzling, or you are building a SwiftUI app, you'll need to explicitly map your APNs token to the FCM registration token. Implement the application(_:didRegisterForRemoteNotificationsWithDeviceToken:) method to retrieve the APNs token, and then set Messaging 's apnsToken property:
Быстрый
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).
Предотвратить автоматическую инициализацию
When a FCM registration is generated, the library uploads the identifier and configuration data to Firebase. If you want to get an explicit opt-in from users first, you can prevent auto registration at configure time by disabling FCM. To do this, add a metadata value to your Info.plist (not your GoogleService-Info.plist ):
FirebaseMessagingAutoInitEnabled = NO
Для повторного включения FCM можно выполнить вызов во время выполнения:
Быстрый
Messaging.messaging().autoInitEnabled = true
Objective-C
[FIRMessaging messaging].autoInitEnabled = YES;
После установки это значение сохраняется при перезапуске приложения.
Настройте расширение службы уведомлений.
To send notifications that include images to Apple devices, you must add a notification service extension. This extension allows devices to display images delivered in the notification payload. If you don't plan to send images in notifications, you can skip this step.
To add a service extension, perform the required setup tasks for modifying and presenting notifications in APNs, and then add the FCM extension helper API in NotificationService.m . Specifically, instead of completing the callback with self.contentHandler(self.bestAttemptContent); , complete it with FIRMessaging extensionHelper as shown:
@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 введите свой токен регистрации.
Выберите тест .
После выбора пункта «Тест» целевое клиентское устройство, на котором приложение работает в фоновом режиме, должно получить уведомление.
For insight into message delivery to your app, go to the DevOps & Engagement > Messaging > Reports dashboard in the Firebase console. This dashboard records the number of messages sent and opened on Apple and Android devices, along with data for "impressions" (notifications seen by users) for Android apps.
Следующие шаги
После завершения этапов настройки, вот несколько вариантов для дальнейшей работы с FCM для платформ Apple:
- Отправляйте сообщения на устройства
- Получайте сообщения в приложении Apple.
- Отправляйте сообщения по темам