在裝置上安裝用戶端應用程式後,應用程式即可透過 FCM APNs 介面接收訊息。您可以透過 通知編輯器,或以應用程式伺服器建構的訊息,立即傳送通知給使用者區隔。
處理快訊通知
FCM 透過 APN 傳送所有鎖定 Apple 應用程式的訊息。如要進一步瞭解如何透過 UNUserNotificationCenter 接收 APN 通知,請參閱 Apple 的「處理通知和通知相關動作」說明文件。
您必須設定 UNUserNotificationCenter 委派並導入適當的委派方法,才能接收 FCM 的顯示通知。
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(); }
如要在通知中加入自訂動作,請在通知酬載中設定 click_action
參數。請使用您在 APN 酬載中用於 category
金鑰的值。自訂動作必須先註冊才能使用。詳情請參閱 Apple 的本機與遠端通知程式設計指南。
如要深入瞭解傳送給應用程式的訊息,請參閱 FCM 報告資訊主頁,其中記錄在 Apple 和 Android 裝置上傳送及開啟的訊息數,以及 Android 應用程式的「曝光」(使用者看到的通知) 資料。
處理靜音推播通知
使用 content-available
鍵傳送訊息 (相當於 APN 的 content-available
) 傳送訊息時,系統會以無聲通知的形式傳送訊息,並在背景喚醒應用程式以執行背景資料重新整理等工作。與前景通知不同的是,這類通知必須透過 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
方法處理。
實作 application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
,如下所示:
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); }
Apple 平台不保證一定會傳送背景通知。如要瞭解可能導致背景通知失敗的條件,請參閱 Apple 的「將背景更新推送至應用程式」說明文件。
解讀通知訊息酬載
通知訊息的酬載是鍵和值的字典。透過 APN 傳送的通知訊息會採用下列 APN 酬載格式:
{ "aps" : { "alert" : { "body" : "great match!", "title" : "Portugal vs. Denmark", }, "badge" : 1, }, "customKey" : "customValue" }
在停用方法滑動的情況下處理訊息
根據預設,如果您將應用程式的應用程式委派類別指派給 UNUserNotificationCenter
和 Messaging
委派屬性,FCM 就會執行應用程式委派類別,自動將 FCM 權杖與裝置的 APN 權杖建立關聯,並將通知接收的事件傳送至 Analytics (分析)。如果您明確停用方法滑動功能,或者是建構 SwiftUI 應用程式,或為任一委派項目使用不同的類別,就必須手動執行這兩項工作。
如要將 FCM 權杖與裝置 APN 權杖建立關聯,請透過 apnsToken
屬性,將 APN 權杖傳遞至應用程式委派權杖重新整理處理常式中的 Messaging
類別。
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; }
如要將通知收據資訊傳送至 Analytics (分析),請使用 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); }