Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

在 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 項目中。

上傳您的 APNs 身份驗證密鑰

將您的 APNs 身份驗證密鑰上傳到 Firebase。如果您還沒有 APNs 身份驗證密鑰,請確保在Apple Developer Member Center中創建一個。

  1. 在 Firebase 控制台的項目中,選擇齒輪圖標,選擇Project Settings ,然後選擇Cloud Messaging選項卡。

  2. iOS app configuration下的APNs authentication key中,單擊Upload按鈕。

  3. 瀏覽到您保存密鑰的位置,選擇它,然後單擊打開。添加密鑰的密鑰 ID(可在Apple Developer Member Center中獲得),然後單擊Upload

註冊遠程通知

無論是在啟動時,還是在應用程序流程中的所需位置,註冊您的應用程序以獲取遠程通知。調用registerForRemoteNotifications如圖:

迅速

if #available(iOS 10.0, *) {
  // For iOS 10 display notification (sent via APNS)
  UNUserNotificationCenter.current().delegate = self

  let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
  UNUserNotificationCenter.current().requestAuthorization(
    options: authOptions,
    completionHandler: { _, _ in }
  )
} else {
  let settings: UIUserNotificationSettings =
    UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
  application.registerUserNotificationSettings(settings)
}

application.registerForRemoteNotifications()

Objective-C

if ([UNUserNotificationCenter class] != nil) {
  // iOS 10 or later
  // For iOS 10 display notification (sent via APNS)
  [UNUserNotificationCenter currentNotificationCenter].delegate = self;
  UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
      UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
  [[UNUserNotificationCenter currentNotificationCenter]
      requestAuthorizationWithOptions:authOptions
      completionHandler:^(BOOL granted, NSError * _Nullable error) {
        // ...
      }];
} else {
  // iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
  UIUserNotificationType allNotificationTypes =
  (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
  UIUserNotificationSettings *settings =
  [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
  [application registerUserNotificationSettings:settings];
}

[application registerForRemoteNotifications];

訪問註冊令牌

默認情況下,FCM SDK 在應用啟動時為客戶端應用實例生成一個註冊令牌。與 APNs 設備令牌類似,此令牌允許您向應用程序的任何特定實例發送有針對性的通知。

與 Apple 平台通常在應用啟動時提供 APNs 設備令牌的方式相同,FCM 通過FIRMessagingDelegate的 messages messaging: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 disabled:映射您的 APNs 令牌和註冊令牌

如果您禁用了方法調配,則需要將您的 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 客戶端后,您就可以向應用程序添加消息處理和其他更高級的行為了。有關更多信息,請參閱這些指南: