在 Apple 平台上設定 Firebase Cloud Messaging 用戶端應用

對於 Apple 用戶端應用,您可以透過 Firebase Cloud Messaging APNs 介面接收最多 4000 位元組的通知和資料負載。

若要使用 Objective-C 或 Swift 編寫客戶端程式碼,我們建議您使用FIRMessaging API快速入門範例提供了兩種語言的範例程式碼。

Firebase 雲端訊息傳遞中的方法調配

FCM SDK 在兩個關鍵領域執行方法混合:將 APNs 令牌對應到 FCM 註冊令牌以及在下游訊息回調處理期間擷取分析資料。不喜歡使用 swizzling 的開發人員可以透過在應用程式的 Info.plist 檔案中新增標誌FirebaseAppDelegateProxyEnabled並將其設為 NO(布林值)來停用它。指南的相關區域提供了啟用和不啟用方法調配的程式碼範例。

將 Firebase 新增到您的 Apple 項目

如果您尚未將 Firebase 新增至您的 Apple 專案中,請將其新增至您的 Apple 專案。

上傳您的 APNs 驗證金鑰

將您的 APNs 驗證金鑰上傳到 Firebase。如果您還沒有 APNs 驗證金鑰,請確保在Apple 開發者會員中心建立一個。

  1. 在 Firebase 控制台的項目內,選擇齒輪圖標,選擇項目設置,然後選擇雲端訊息傳遞選項卡。

  2. iOS 應用程式設定下的APNs 驗證金鑰中,按一下上傳按鈕。

  3. 瀏覽到儲存金鑰的位置,選擇它,然後按一下「開啟」 。新增金鑰的金鑰 ID(可在Apple 開發者會員中心取得)並點選Upload

註冊遠端通知

在啟動時或在應用程式流程中的所需位置,註冊您的應用程式以取得遠端通知。呼叫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];

訪問註冊令牌

預設情況下,FCM SDK 在應用程式啟動時為客戶端應用程式實例產生註冊令牌。與 APNs 裝置令牌類似,此令牌可讓您向應用程式的任何特定實例發送有針對性的通知。

與 Apple 平台通常在應用程式啟動時傳遞 APNs 裝置令牌的方式相同,FCM 透過FIRMessagingDelegatemessaging:didReceiveRegistrationToken:方法提供註冊令牌。 FCM SDK 在應用程式初始啟動期間以及每當令牌更新或失效時都會檢索新的或現有的令牌。在所有情況下,FCM SDK 都會使用有效令牌messaging:didReceiveRegistrationToken:

註冊令牌可能會在以下情況下變更:

  • 該應用程式已在新設備上恢復
  • 用戶卸載/重新安裝應用程式
  • 用戶清除應用程式資料。

設定訊息委託

若要接收註冊令牌,請實作訊息傳遞委託協定並在呼叫[FIRApp configure]後設定FIRMessagingdelegate屬性。例如,如果您的應用程式委託符合訊息傳遞委託協議,您可以將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 FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-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.
}

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.
}

或者,您可以偵聽名為kFIRMessagingRegistrationTokenRefreshNotificationNSNotification ,而非提供委託方法。令牌屬性始終具有目前令牌值。

禁用 Swizzling:映射您的 APNs 令牌和註冊令牌

如果您已停用方法調配,或正在建立 SwiftUI 應用程序,則需要將 APNs 令牌明確對應到 FCM 註冊令牌。實作application(_:didRegisterForRemoteNotificationsWithDeviceToken:)方法來檢索 APNs 令牌,然後設定MessagingapnsToken屬性:

迅速

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 用戶端後,您就可以向應用程式新增訊息處理和其他更進階的行為。請參閱這些指南以獲取更多資訊: