Gdy aplikacja klienta zostanie zainstalowana na urządzeniu, będzie mogła odbierać wiadomości za pomocą interfejsu FCM APN. Możesz od razu zacząć wysyłać powiadomienia do segmentów użytkowników za pomocą narzędzia do tworzenia powiadomień lub wiadomości utworzonych na serwerze aplikacji.
Obsługa powiadomień o alertach
FCM dostarcza wszystkie wiadomości kierowane do aplikacji Apple za pomocą APN. Więcej informacji o otrzymywaniu powiadomień APN przez UNUserNotificationCenter znajdziesz w dokumentacji Apple Zarządzanie powiadomieniami i działaniami związanymi z powiadomieniami.
Aby otrzymywać powiadomienia wyświetlane przez FCM, musisz ustawić delegata UNUserNotificationCenter i zaimplementować odpowiednie metody delegata.
Swift
extension AppDelegate: UNUserNotificationCenterDelegate { // Receive displayed notifications for iOS 10 devices. func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions { let userInfo = notification.request.content.userInfo // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // ... // Print full message. print(userInfo) // Change this to your preferred presentation option return [[.alert, .sound]] } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async { let userInfo = response.notification.request.content.userInfo // ... // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // Print full message. print(userInfo) } }
Objective-C
// Receive displayed notifications for iOS 10 devices. // Handle incoming notification messages while app is in the foreground. - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { NSDictionary *userInfo = notification.request.content.userInfo; // With swizzling disabled you must let Messaging know about the message, for Analytics // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; // ... // Print full message. NSLog(@"%@", userInfo); // Change this to your preferred presentation option completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert); } // Handle notification messages after display notification is tapped by the user. - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { NSDictionary *userInfo = response.notification.request.content.userInfo; if (userInfo[kGCMMessageIDKey]) { NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]); } // With swizzling disabled you must let Messaging know about the message, for Analytics // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; // Print full message. NSLog(@"%@", userInfo); completionHandler(); }
Jeśli chcesz dodać do powiadomień działania niestandardowe, w danych powiadomienia ustaw parametr click_action
.
Użyj wartości, której używasz w kluczu category
w danych APN. Przed użyciem działań niestandardowych należy je zarejestrować. Więcej informacji znajdziesz w przewodniku Apple dotyczącym programowania powiadomień lokalnych i zdalnych.
Aby uzyskać informacje o dostarczaniu wiadomości do aplikacji, otwórz FCM panel raportowania, który zawiera informacje o liczbie wiadomości wysłanych i otwartych na urządzeniach Apple i Android, a także dane o wyświetleniach (powiadomieniach wyświetlanych użytkownikom) aplikacji na Androida.
Obsługa wyciszonych powiadomień push
Gdy wysyłasz wiadomości za pomocą klucza content-available
(odpowiadającego kluczowi content-available
w usłudze APN), wiadomości są dostarczane jako powiadomienia bezdźwiękowe, które budzą aplikację w tle do wykonywania zadań takich jak odświeżanie danych w tle.
W przeciwieństwie do powiadomień na pierwszym planie te powiadomienia muszą być obsługiwane za pomocą metody application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
w ten sposób:
Swift
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async -> UIBackgroundFetchResult { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // Messaging.messaging().appDidReceiveMessage(userInfo) // Print message ID. if let messageID = userInfo[gcmMessageIDKey] { print("Message ID: \(messageID)") } // Print full message. print(userInfo) return UIBackgroundFetchResult.newData }
Objective-C
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // If you are receiving a notification message while your app is in the background, // this callback will not be fired till the user taps on the notification launching the application. // TODO: Handle data of notification // With swizzling disabled you must let Messaging know about the message, for Analytics // [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; // ... // Print full message. NSLog(@"%@", userInfo); completionHandler(UIBackgroundFetchResultNewData); }
Platformy Apple nie gwarantują dostarczania powiadomień w tle. Informacje o warunkach, które mogą powodować niepowodzenie powiadomień w tle, znajdziesz w dokumentacji Apple dotyczącej przesyłania powiadomień w tle do aplikacji.
Interpretowanie ładunku wiadomości powiadomienia
Ładunek wiadomości powiadomienia to słownik kluczy i wartości. Wiadomości z powiadomieniami wysyłane przez APNs mają format ładunku APNs:
{ "aps" : { "alert" : { "body" : "great match!", "title" : "Portugal vs. Denmark", }, "badge" : 1, }, "customKey" : "customValue" }
Obsługa wiadomości z wyłączonym mieszaniem metod
Domyślnie, jeśli przypiszesz klasę zastępczą aplikacji do właściwości zastępczych UNUserNotificationCenter
i Messaging
, usługa FCM automatycznie powiąże Twój token FCM z tokenem APN urządzenia i przekaże zdarzenia otrzymania powiadomienia do usługi Analytics. Jeśli wyłączysz zamianę metody, tworzysz aplikację SwiftUI lub używasz osobnej klasy dla każdego delegowanego obiektu, musisz wykonać oba te zadania ręcznie.
Aby powiązać token FCM z tokenem APNs urządzenia, przekaż token APNs do klasy Messaging
w obiekcie token refresh handler delegata aplikacji za pomocą właściwości apnsToken
.
Swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken; }
Objective-C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [FIRMessaging messaging].APNSToken = deviceToken; }
Aby przekazać informacje o otrzymaniu powiadomienia do Analytics, użyj metody appDidReceiveMessage(_:)
.
Swift
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { let userInfo = notification.request.content.userInfo Messaging.messaging().appDidReceiveMessage(userInfo) // Change this to your preferred presentation option completionHandler([[.alert, .sound]]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo Messaging.messaging().appDidReceiveMessage(userInfo) completionHandler() } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Messaging.messaging().appDidReceiveMessage(userInfo) completionHandler(.noData) }
Objective-C
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { NSDictionary *userInfo = notification.request.content.userInfo; [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; // Change this to your preferred presentation option completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert); } - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { NSDictionary *userInfo = response.notification.request.content.userInfo; [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; completionHandler(); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { [[FIRMessaging messaging] appDidReceiveMessage:userInfo]; completionHandler(UIBackgroundFetchResultNoData); }