1. 简介
上次更新时间:2020-1-6
Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地传递消息,且无需任何费用。
使用 FCM,您可以通知客户端应用有新的电子邮件或其他数据有待同步。您可以发送通知消息进行用户再互动并留住他们。在即时通讯等使用情形中,一条消息可将最多 4KB 的载荷传送至客户端应用。
运作方式
FCM 实现包括用于发送和接收的两个主要组件:
- 一个受信任的环境,例如 Cloud Functions for Firebase 或用于构建、定位和发送消息的应用服务器。
 - 一个通过针对具体平台的相应传输服务接收消息的 iOS、Android 或 Web (JavaScript) 客户端应用。
 
FCM 架构概览

FCM 依赖于以下一组组件来构建、传输和接收消息:
- 用于编写或构建消息请求的工具。通知编辑器提供了一种基于 GUI 的用于创建通知请求的方式。要实现对所有消息类型的完全自动化和支持,您必须在支持 Firebase Admin SDK 或 FCM 服务器协议的受信任服务器环境中构建消息请求。此环境可以是 Cloud Functions for Firebase、Google App Engine 或您自己的应用服务器。
 - FCM 后端(以及其他函数),它接受消息请求,通过主题对消息执行扇出,并生成消息 ID 等消息元数据。
 - 平台级传输层,用于将消息路由到目标设备、处理消息传送,并在适当情况下应用针对具体平台的配置。此传输层包括:
 
- Android 传输层 (ATL),适用于运行 Google Play 服务的 Android 设备
 - 适用于 iOS 设备的 Apple 推送通知服务 (APNs)
 - Web 应用的网络推送协议
 
- 用户设备上的 FCM SDK,根据应用的前台/后台状态和任何相关应用逻辑显示通知或处理消息。
 
构建内容
在此 Codelab 中,您将使用 FCM 向示例 iOS 应用添加推送通知。
学习内容
- 如何订阅和取消订阅推送消息
 - 如何处理收到的推送消息
 - 如何显示通知
 - 如何响应通知点击
 
所需条件
- Xcode 11.0 或更高版本
 - CocoaPods 1.9.0 或更高版本
 - Apple 开发者账号
 - 一台用于运行应用的 iOS 真机设备
 - Swift 基础知识
 
2. 准备工作
下载示例代码
在此 Codelab 中,您将构建自己的测试应用,但如果您想查看并运行现有的示例应用,可以下载快速入门示例代码。
您可以通过以下两种方式获取示例:
- 克隆 Git 代码库:
 
$ git clone https://github.com/firebase/quickstart-ios.git
- 下载 ZIP 文件:
 
如果您将源代码下载为 ZIP 文件,解压缩后会得到一个根文件夹 quickstart-ios。
创建新应用
按以下步骤创建您自己的测试应用(以下步骤是在 Xcode 12.3 中执行的):
- 打开 Xcode,然后选择创建新的 Xcode 项目。
 - 选择应用,然后点击下一步。
 

- 输入商品名称(例如:MessagingExample)
 - 选择团队(如果您尚未创建团队,请在 Apple 开发者账号中进行配置)。
 - 输入组织标识符(例如,
com.your-name) - 输入软件包标识符(例如 
com.your-name.MessagingExample,在所有 iOS 应用中应该是唯一的)。 - 在界面下拉菜单中选择故事板。
 - 在 Life Cycle 下拉菜单中选择 UIKit App Delegate。
 - 在语言中选择 Swift。
 - 点击下一步。
 

创建 APN 密钥并将应用注册到 Firebase 项目时,您需要提供软件包标识符。
3. 配置 APNs
创建身份验证密钥
本部分介绍如何为启用推送通知的应用 ID 生成身份验证密钥。如果您有现成的密钥,则可以使用该密钥,而不必生成新的密钥。
如需创建身份验证密钥,请执行以下操作:
- 在您的开发者账号中,前往证书、标识符和描述文件,然后前往密钥。
 

- 点击右上角的“添加”按钮 (+)。
 

- 输入 APNs 身份验证密钥的说明。
 - 在“主要服务”下,选择“APNs”复选框,然后点击继续。
 

- 点击注册,然后点击下载。将密钥保存在安全的地方。此下载是一次性的,您无法在以后重新获取该密钥。
 

创建应用 ID
应用 ID 是应用的唯一标识。按照惯例,它由反向域名表示。
- 前往 Apple 开发者会员中心并登录。
 - 前往 Certificates, Identifiers and Profiles。
 - 前往标识符。
 - 点击 + 按钮以创建新的应用 ID。

 - 选择应用 ID 单选按钮,然后点击继续。
 

- 选择应用,然后点击继续。
 

- 如需创建新的应用 ID,请执行以下操作:
 - 为您的应用 ID 输入名称。
 - 输入团队 ID。此值必须与“Membership”标签中的 Team ID 匹配。
 - 在 App ID Suffix 部分,选择 Explicit App ID,然后输入您的 Bundle ID。

 - 在 应用服务 部分,确保选中 推送通知。

 - 点击继续,并检查您输入的内容是否正确:
 - Identifier 的值应与 Team ID 和 Bundle ID 的合并值相一致
 - 推送通知应当可以配置
 - 点击 Register,创建应用 ID。
 
创建个人资料
要在开发时测试您的应用,您需要为开发环境创建一个配置文件,授权您的设备运行尚未在 App Store 发布的应用。
- 前往 Apple 开发者会员中心并登录。
 - 前往 Certificates, Identifiers and Profiles。
 - 在左上角的下拉菜单中,如果未选择 iOS, tvOS, watchOS,请进行选择,然后前往配置文件。
 - 点击 + 按钮以创建新的配置文件。

 - 选择 iOS 应用开发作为配置文件类型,然后点击继续。
 

- 在下拉菜单中,选择您希望使用的应用 ID,然后点击继续。
 - 选择您在上一步中所选应用 ID 的 iOS 开发证书,然后点击 Continue。
 - 选择您希望包括在配置文件中的 iOS 设备,然后点击 Continue。确保选择您要用于测试的所有设备。
 - 为此配置文件输入名称(例如 MessagingExampleProfile),然后点击 Generate。
 

- 点击 Download,将配置文件保存至您的 Mac。
 

- 双击配置文件进行安装。
 
4. 将 Firebase 添加到您的 iOS 项目
创建 Firebase 项目
您必须先创建一个要关联到您的 iOS 应用的 Firebase 项目,然后才能将 Firebase 添加到该 iOS 应用。如需详细了解 Firebase 项目,请访问了解 Firebase 项目。
- 在 Firebase 控制台中,点击添加项目,然后选择或输入一个项目名称。

 
如果您已有 Google Cloud Platform (GCP) 项目,则可以从下拉菜单中选择该项目,然后将 Firebase 资源添加到该项目中。
- (可选)如果要创建一个新项目,可以修改项目 ID。
 
Firebase 会自动为您的 Firebase 项目分配一个唯一的 ID。如需详细了解 Firebase 如何使用项目 ID,请访问“了解 Firebase 项目”。
- 点击继续。
 - 为您的项目设置 Google Analytics,以便在使用以下任何 Firebase 产品时获得最佳体验:
 
- Firebase Crashlytics
 - Firebase Predictions
 - Firebase Cloud Messaging
 - Firebase In-App Messaging
 - Firebase Remote Config
 - Firebase A/B Testing
 
出现提示时,选择使用现有的 Google Analytics 账号或新建账号。如果您选择新建账号,请选择 Analytics 报告位置,然后接受项目的数据共享设置和 Google Analytics 条款。


- 点击创建项目(如果使用现有的 GCP 项目,则点击添加 Firebase)。
 
Firebase 会自动为您的 Firebase 项目预配资源。完成此过程后,您将进入 Firebase 控制台中 Firebase 项目的概览页面。
在 Firebase 中注册您的应用
有了 Firebase 项目后,您就可以将自己的 iOS 应用添加到其中了。
请访问了解 Firebase 项目,详细了解将应用添加到 Firebase 项目的最佳做法和注意事项,包括如何处理多个 build 变体。
- 转到 Firebase 控制台。
 - 在项目概览页面的中心位置,点击 iOS 图标以启动设置工作流。
 
如果您已向 Firebase 项目添加了应用,请点击“添加应用”以显示平台选项。

- 在 iOS 软件包 ID 字段中输入应用的软件包 ID。
 - (可选)输入其他应用信息:应用别名和 App Store ID。
 - 点击注册应用。
 

添加 Firebase 配置文件
- 点击下载 GoogleService-Info.plist,获取 Firebase iOS 配置文件 (
GoogleService-Info.plist)。
 - 将配置文件移至 Xcode 项目的根目录中。如果出现提示,请选择将配置文件添加到所有目标。
 

如果您的项目中有多个软件包 ID,必须将每个软件包 ID 与 Firebase 控制台中的注册应用相关联,使每个应用都有自己的 GoogleService-Info.plist 文件。
关闭 Xcode。
将 Firebase SDK 添加到您的应用中
我们建议使用 CocoaPods 安装 Firebase 库。不过,如果您不想使用 CocoaPods,可以直接集成 SDK 框架,也可以使用 Swift Package Manager Beta 版。
- 如果您没有 Podfile,请创建一个。如果您使用的是快速入门示例,则示例中已提供 Xcode 项目和 Podfile(包含 pod)。
 
$ cd MessagingExample $ pod init
- 将想要用在应用中的 Firebase pod 添加到 Podfile。
 
您可以将任何受支持的 Firebase 产品添加到 iOS 应用中。
在快速入门示例中,已添加 Google Analytics 和 Firebase Cloud Messaging SDK。
# Add the Firebase pod for Google Analytics pod 'Firebase/Analytics' # Add the pod for Firebase Cloud Messaging pod 'Firebase/Messaging'
- 安装 pod,然后打开 
.xcworkspace文件,以便在 Xcode 中查看该项目: 
$ pod install
- 打开 
MessagingExample.xcworkspace,然后在 Firebase 控制台中点击下一步。
 
在应用中初始化 Firebase
您需要为应用添加 Firebase 初始化代码。
导入 Firebase 模块并配置一个共享实例(在快速入门示例中,Firebase 模块已导入)。
- 在 
UIApplicationDelegate中导入 Firebase 模块: 
AppDelegate.swift
import UIKit
import Firebase // Add this line
- 配置一个 FirebaseApp 共享实例(通常在应用的 
application:didFinishLaunchingWithOptions:方法中配置): 
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
- 在 Firebase 控制台中点击下一步。

 - Firebase SDK 已添加到您的应用中。点击继续并前往控制台。

 
5. 配置 FCM 客户端
上传您的 APNs 身份验证密钥
将您的 APNs 身份验证密钥上传到 Firebase。
- 在 Firebase 控制台中,在您的项目内依次选择齿轮图标、项目设置以及 Cloud Messaging 标签页。
 

- 在 Apple 应用配置下的 APNs 身份验证密钥中,点击上传按钮以上传您的开发身份验证密钥、生产身份验证密钥,或两者。请至少提供其中一项。
 

- 浏览到您保存密钥的位置,选择该密钥,然后点击打开。添加该密钥的 ID(可在 Apple Developer Member Center 的证书、标识符和个人资料中找到),然后点击上传。

 
注册接收远程通知
可在启动时或在应用流程中期望的时间点注册您的应用,以便接收远程通知。
在快速入门示例中,已添加 registerForRemoteNotifications。
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}
通过在 AppDelegate.swift 的末尾添加以下代码行来分配 UNUserNotificationCenter 的委托属性。
AppDelegate.swift
@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo
    // Print full message.
    print(userInfo)
    // Change this to your preferred presentation option
    completionHandler([[.alert, .sound]])
  }
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    // Print full message.
    print(userInfo)
    completionHandler()
  }
}
设置消息委托
如需接收注册令牌,请实现消息委托协议,并在调用 [FIRApp configure] 后设置 FIRMessaging 的 delegate 属性。例如,如果您的应用委托符合消息委托协议,可以将 application:didFinishLaunchingWithOptions: 上的委托设为其本身(在快速入门示例中,此委托已设置)。
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure()
  Messaging.messaging().delegate = self // Add this line
  // [START register for remote notifications]
  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()
  // [END register for remote notifications]
  return true
}
通过在 AppDelegate.swift 的末尾添加以下代码行来分配 FIRMessaging 的委托属性。
AppDelegate.swift
extension AppDelegate : MessagingDelegate {
  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)
  }
}
添加功能
您已在“创建应用 ID”部分中添加了“推送通知”功能,但还必须在 XCode 中按照以下步骤添加此功能(以下步骤适用于 XCode 12.3):
- 点击 Navigator 区域中的项目名称。
 - 点击签名和功能。
 - 点击 + 功能。
 

- 双击后台模式。
 - 再次点击 + 功能。
 - 双击推送通知。
 - 在后台模式部分中,选中远程通知。
 

6. 发送通知消息
您可以按照以下步骤发送测试消息:
- 在目标设备上安装并运行该应用。您需要接受权限请求,才能收到远程通知。
 - 在 Xcode 日志中获取注册令牌。
 

- 确保应用在设备的后台中运行。
 - 打开通知编辑器,然后选择新建通知。
 - 输入消息内容。

 - 选择发送测试消息。
 - 在标签为添加 FCM 注册令牌的字段中,输入您在第 2 步中获得的注册令牌。
 - 点击测试。
 
在您点击测试后,目标客户端设备(在后台中运行应用)应该会在通知中心内接收到通知。
如需详细了解发送到您应用的消息,请参阅 FCM 报告信息中心,该信息中心会记录在 iOS 和 Android 设备上发送和打开的消息数量。

7. 恭喜
恭喜,您已成功发送测试消息!
FCM 中还有许多其他功能和配置,例如主题订阅。
如果您对这些功能感兴趣,可以查看官方开发者文档。
后续操作
不妨查看以下 Codelab。