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

如果是 Apple 用戶端應用程式,您可透過 Firebase Cloud Messaging APNs 介面接收通知和資料酬載,最多 4096 位元組。

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

Firebase Cloud Messaging 中的方法交換

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

將 Firebase 新增至 Apple 專案

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

上傳 APN 驗證金鑰

將 APNs 驗證金鑰上傳至 Firebase。 如果沒有 APNs 驗證金鑰,請務必在 Apple 開發人員會員中心建立。

  1. Firebase 控制台的專案中,依序選取齒輪圖示、「專案設定」和「Cloud Messaging」分頁標籤。

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

  3. 瀏覽至您儲存金鑰的位置,選取金鑰,然後按一下「開啟」。新增金鑰的 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.
}

或者,您也可以監聽名為 NSNotificationkFIRMessagingRegistrationTokenRefreshNotification,而非提供委派方法。權杖屬性一律會包含目前的權杖值。

停用 Swizzling:對應 APNs 權杖和註冊權杖

如果您已停用方法交換,或是要建構 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 用戶端後,您就可以在應用程式中新增訊息處理程序和其他進階行為。詳情請參閱下列指南: