Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

在iOS上設置Firebase Cloud Messaging客戶端應用

對於iOS客戶端應用程序,您可以通過Firebase Cloud Messaging APNs界面接收多達4KB的通知和數據有效負載。

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

Firebase Cloud Messaging中的方法混亂

FCM SDK在兩個關鍵區域執行方法處理: 將您的APNs令牌映射到FCM註冊令牌,以及在下游消息回調處理期間捕獲分析數據。不想使用混亂的開發人員可以通過在應用程序的Info.plist文件中添加標誌FirebaseAppDelegateProxyEnabled並將其設置為NO(布爾值)來禁用它。指南的相關區域提供了代碼示例,無論啟用還是不啟用方法轉換。

將Firebase添加到您的iOS項目

本部分介紹如果您已經為應用程序啟用了其他Firebase功能,則可能已完成的任務。專門針對FCM,您需要上傳APNs身份驗證密鑰註冊遠程通知

先決條件

  • 安裝以下內容:

    • Xcode 11.0或更高版本
    • CocoaPods 1.4.0或更高版本
  • 確保您的項目符合以下要求:

    • 您的項目必須針對iOS 8或更高版本。
  • 設置物理iOS設備以運行您的應用,並完成以下任務:

    • 為您的Apple Developer帳戶獲取Apple Push Notification身份驗證密鑰。
    • 在“ 應用程序>功能”下的XCode中啟用推送通知。

如果您還沒有Xcode項目,而只想試用Firebase產品,則可以下載我們的快速入門樣本之一

創建一個Firebase項目

在將Firebase添加到iOS應用之前,您需要創建一個Firebase項目以連接到iOS應用。訪問了解Firebase項目以了解有關Firebase項目的更多信息。

在Firebase中註冊您的應用

在擁有Firebase項目之後,可以將您的iOS應用添加到其中。

訪問“ 了解Firebase項目”以了解有關將應用程序添加到Firebase項目的最佳實踐和注意事項的更多信息,包括如何處理多個構建變體。

  1. 轉到Firebase控制台

  2. 在項目概述頁面的中心,單擊iOS圖標( )以啟動設置工作流程。

    如果您已經將應用程序添加到Firebase項目中,請單擊“ 添加應用程序”以顯示平台選項。

  3. iOS捆綁包ID字段中輸入您應用的捆綁包ID

  4. (可選)輸入其他應用信息: 應用暱稱應用商店ID

  5. 點擊註冊應用

添加Firebase配置文件

  1. 單擊“ 下載GoogleService-Info.plist”以獲取Firebase iOS配置文件( GoogleService-Info.plist )。

  2. 將您的配置文件移到Xcode項目的根目錄中。如果出現提示,請選擇將配置文件添加到所有目標。

如果您的項目中有多個捆綁軟件ID,則必須將每個捆綁軟件ID與Firebase控制台中已註冊的應用程序相關聯,以便每個應用程序都可以擁有自己的GoogleService-Info.plist文件。

將Firebase SDK添加到您的應用

我們建議使用CocoaPods安裝Firebase庫。但是,如果您不想使用CocoaPods,則可以直接集成SDK框架 ,也可以使用Swift Package Manager beta

您使用的是快速入門示例之一嗎? Xcode項目和Podfile(帶有Pod)已經存在,但是您仍然需要添加Firebase配置文件安裝 Pod。

  1. 如果您還沒有Podfile,請創建一個:

    cd your-project-directory
    pod init
  2. 在您的Podfile中,添加要在應用程序中使用的Firebase Pod。

    您可以將任何受支持的Firebase產品添加到iOS應用中。

    為了獲得Firebase Cloud Messaging的最佳體驗,我們建議您在項目中啟用Google Analytics(分析) 。另外,作為設置Google Analytics(分析)的一部分,您需要將Firebase SDK for Analytics添加到您的應用中。

    啟用分析

    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'

    未啟用分析

    第985章
  3. 安裝Pod,然後打開您的.xcworkspace文件以查看Xcode中的項目:

    pod install
    open your-project.xcworkspace

上傳您的APNs身份驗證密鑰

將您的APNs身份驗證密鑰上載到Firebase。如果您還沒有APNs身份驗證密鑰,請參閱使用FCM配置APNs

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

  2. iOS應用配置下的APNs身份驗證密鑰中 ,點擊上傳按鈕。

  3. 瀏覽到保存密鑰的位置,選擇它,然後單擊“ 打開” 。添加密鑰的密鑰ID(可在Apple Developer Member Center中的證書,標識符和配置文件中找到),然後單擊Upload

在您的應用中初始化Firebase

您需要將Firebase初始化代碼添加到您的應用程序。導入Firebase模塊並配置共享實例,如下所示:

  1. 將Firebase模塊導入UIApplicationDelegate

    迅速

    4

    物鏡

    @import Firebase;
  2. 配置FirebaseApp共享實例,通常在應用程序的application:didFinishLaunchingWithOptions:方法中:

    迅速

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    目標C

    // Use Firebase library to configure APIs
    [FIRApp configure];

註冊以獲取遠程通知

在啟動時或在應用程序流程中的所需位置,為遠程通知註冊應用程序。如下所示調用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()

物鏡

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設備令牌類似,此令牌使您可以將定向的通知發送到應用程序的任何特定實例。

與iOS通常在應用程序啟動時交付APNs設備令牌的方式相同,FCM通過FIRMessagingDelegate messaging:didReceiveRegistrationToken: FIRMessagingDelegate messaging:didReceiveRegistrationToken:方法提供註冊令牌。 FCM SDK在初始應用啟動期間以及令牌更新或無效時都會檢索新令牌或現有令牌。在所有情況下,FCM SDK都會使用有效令牌調用messaging:didReceiveRegistrationToken:

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

  • 該應用已在新設備上還原
  • 用戶卸載/重新安裝應用程序
  • 用戶清除應用程序數據。

設置消息傳遞委託

要接收註冊令牌,請在調用[FIRApp configure]之後實現消息傳遞委託協議並設置FIRMessagingdelegate屬性。例如,如果您的應用程序委託符合消息傳遞委託協議,則可以將application:didFinishLaunchingWithOptions:上的委託設置為其自身。

迅速

Messaging.messaging().delegate = self

物鏡

[FIRMessaging messaging].delegate = self;

獲取當前註冊令牌

註冊令牌是通過messaging:didReceiveRegistrationToken:方法交付的。通常每個應用以註冊令牌開始一次調用此方法。調用此方法時,是執行以下操作的理想時間:

  • 如果註冊令牌是新的,請將其發送到您的應用程序服務器。
  • 將註冊令牌訂閱到主題。僅對於新訂閱或用戶重新安裝該應用程序的情況,才需要這樣做。

您可以使用instanceIDWithHandler:直接檢索令牌。該回調提供了一個InstanceIDResult ,其中包含令牌。如果InstanceID檢索以任何方式失敗,則提供非null錯誤。

迅速

InstanceID.instanceID().instanceID { (result, error) in
  if let error = error {
    print("Error fetching remote instance ID: \(error)")
  } else if let result = result {
    print("Remote instance ID token: \(result.token)")
    self.instanceIDTokenMessage.text  = "Remote InstanceID token: \(result.token)"
  }
}

目標C

[[FIRInstanceID instanceID] instanceIDWithHandler:^(FIRInstanceIDResult * _Nullable result,
                                                    NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error fetching remote instance ID: %@", error);
  } else {
    NSLog(@"Remote instance ID token: %@", result.token);
    NSString* message =
      [NSString stringWithFormat:@"Remote InstanceID token: %@", result.token];
    self.instanceIDTokenMessage.text = message;
  }
}];

通常,令牌在本地可用,因此此方法不會打開網絡連接。您可以隨時使用此方法訪問令牌,而不是存儲令牌。

監控令牌刷新

要在令牌更新時得到通知,請提供符合消息傳遞委託協議的委託。下面的示例註冊委託並添加適當的委託方法:

迅速

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
  print("Firebase registration token: \(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.
}

目標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而不必提供委託方法。令牌屬性始終具有當前令牌值。

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

如果您禁用了方法混淆,則需要將APNs令牌顯式映射到FCM註冊令牌。覆蓋方法didRegisterForRemoteNotificationsWithDeviceToken以檢索APNs令牌,然後設置FIRMessagingAPNSToken屬性:

迅速

func application(application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
  Messaging.messaging().apnsToken = deviceToken
}

物鏡

// With "FirebaseAppDelegateProxyEnabled": NO
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [FIRMessaging messaging].APNSToken = deviceToken;
}

生成FCM註冊令牌後,您可以使用與啟用Swizzling相同的方法來訪問它並監聽刷新事件。

導入現有的用戶APNs令牌

如果您有要加入FCM客戶端應用程序的現有用戶群,請使用實例ID提供的batchImport API。使用此API,您可以將現有的iOS APNs令牌批量導入FCM,將它們映射到新的有效註冊令牌。

防止自動初始化

FCM生成一個實例ID,該實例ID用作FCM中的註冊令牌。生成實例ID時,庫會將標識符和配置數據上傳到Firebase。如果要在使用實例ID之前獲得明確的選擇加入,則可以通過禁用FCM來防止在配置時生成。為此,請將元數據值添加到您的Info.plist (而不是GoogleService-Info.plist ):

FirebaseMessagingAutoInitEnabled = NO

要重新啟用FCM,可以進行運行時調用:

迅速

Messaging.messaging().autoInitEnabled = true

目標C

[FIRMessaging messaging].autoInitEnabled = YES;

設置後,此值將在應用程序重啟後持續存在。

下一步

設置iOS客戶端后,即可為應用添加消息處理和其他更高級的行為。有關更多信息,請參見以下指南: