在 Apple 平台上設定 Firebase 雲端通訊用戶端應用程式

如果是 Apple 用戶端應用程式,您可以透過 Firebase Cloud Messaging APN 介面接收通知和資料酬載,大小上限為 4096 個位元組。

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

Firebase Cloud Messaging 中的方法交換

FCM SDK 會在兩個重要領域執行方法 swizzling:將 APNs 權杖對應至 FCM 註冊權杖,並在下游訊息回呼處理期間擷取數據分析資料。如果開發人員不想使用 swizzling,可以在應用程式的 Info.plist 檔案中新增標記 FirebaseAppDelegateProxyEnabled,並將其設為 NO (布林值) 來停用 swizzling。指南的相關部分會提供程式碼範例,包括啟用和停用方法混合功能的範例。

將 Firebase 新增至 Apple 專案

如果您尚未將 Firebase 新增至 Apple 專案,請新增 Firebase

上傳 APNs 驗證金鑰

將 APNs 驗證金鑰上傳至 Firebase。如果您尚未取得 APNs 驗證金鑰,請務必前往 Apple Developer Member Center 建立金鑰。

  1. Firebase 控制台的專案中,依序選取齒輪圖示、「Project Settings」(專案設定),然後選取「Cloud Messaging」分頁。

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

  3. 瀏覽至儲存金鑰的位置,選取金鑰,然後按一下「Open」。新增金鑰的金鑰 ID (可在 Apple Developer Member Center 中找到),然後按一下「上傳」

註冊遠端通知

請在啟動時或應用程式流程中的所需位置,為應用程式註冊遠端通知。如圖所示,呼叫 registerForRemoteNotifications

Swift

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: 的委派程式設為自身。

Swift

Messaging.messaging().delegate = self

Objective-C

[FIRMessaging messaging].delegate = self;

擷取目前的註冊權杖

註冊權杖會透過 messaging:didReceiveRegistrationToken: 方法傳送。這個方法通常會在應用程式啟動時,搭配註冊權杖呼叫一次。呼叫此方法時,是執行下列操作的理想時機:

  • 如果註冊權杖是新的,請將其傳送至應用程式伺服器。
  • 將註冊權杖訂閱主題。只有在使用者重新安裝應用程式,或新訂閱時才需要這項資訊。

您可以直接使用 token(completion:) 擷取權杖。如果權杖擷取作業以任何方式失敗,系統會提供非空值錯誤。

Swift

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;
  }
}];

您隨時可以使用此方法存取權杖,而非儲存權杖。

監控權杖重新整理

如要隨時收到符號更新通知,請提供符合訊息委派程式通訊協定的委派程式。以下範例會註冊委派作業並新增適當的委派作業方法:

Swift

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:對應 APN 權杖和註冊權杖

如果您已停用方法混合,或正在建構 SwiftUI 應用程式,則必須明確將 APNs 權杖對應至 FCM 註冊權杖。實作 application(_:didRegisterForRemoteNotificationsWithDeviceToken:) 方法來擷取 APNs 權杖,然後設定 MessagingapnsToken 屬性:

Swift

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 註冊權杖時,程式庫會將 ID 和設定資料上傳至 Firebase。如果您想先取得使用者的明確選擇加入資訊,可以停用 FCM,避免在設定時產生權杖。如要這麼做,請將中繼資料值新增至 Info.plist (而非 GoogleService-Info.plist):

FirebaseMessagingAutoInitEnabled = NO

如要重新啟用 FCM,您可以發出執行階段呼叫:

Swift

Messaging.messaging().autoInitEnabled = true

Objective-C

[FIRMessaging messaging].autoInitEnabled = YES;

設定後,這個值會在應用程式重新啟動時保留。

後續步驟

設定 Apple 用戶端後,您就可以在應用程式中新增訊息處理和其他更進階的行為。請參閱以下指南,瞭解詳情: