了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

在 Apple 平台上設置 Firebase 雲消息傳遞客戶端應用

對於 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 客戶端后,您就可以向應用程序添加消息處理和其他更高級的行為。請參閱這些指南以獲取更多信息: