向 iOS 应用添加推送通知

1. 简介

上次更新时间:2020-1-6

Firebase Cloud Messaging (FCM) 是一种跨平台消息传递解决方案,可供您可靠地发送消息。

使用 FCM,您可以通知客户端应用有新的电子邮件或其他数据有待同步。您可以发送通知消息进行用户再互动并留住他们。在即时通讯等使用情形中,一条消息可将最多 4KB 的载荷传送至客户端应用。

运作方式

FCM 实现包括用于发送和接收的两个主要组件:

  1. 一个受信任的环境,例如 Cloud Functions for Firebase 或用于构建、定位和发送消息的应用服务器。
  2. 一个通过针对具体平台的相应传输服务接收消息的 iOS、Android 或 Web (JavaScript) 客户端应用。

FCM 架构概览

6636933bbe959ef2.png

FCM 依赖于以下一组组件来构建、传输和接收消息:

  1. 用于编写或构建消息请求的工具。通知编辑器提供了一种基于 GUI 的用于创建通知请求的方式。要实现对所有消息类型的完全自动化和支持,您必须在支持 Firebase Admin SDK 或 FCM 服务器协议的受信任服务器环境中构建消息请求。此环境可以是 Cloud Functions for Firebase、Google App Engine 或您自己的应用服务器。
  2. FCM 后端(以及其他函数),它接受消息请求,通过主题对消息执行扇出,并生成消息 ID 等消息元数据。
  3. 平台级传输层,用于将消息路由到目标设备、处理消息传送,并在适当情况下应用针对具体平台的配置。此传输层包括:
  • Android 传输层 (ATL),适用于运行 Google Play 服务的 Android 设备
  • 适用于 iOS 设备的 Apple 推送通知服务 (APNs)
  • Web 应用的网络推送协议
  1. 用户设备上的 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 中执行的):

  1. 打开 Xcode,然后选择创建新的 Xcode 项目
  2. 选择应用,然后点击下一步

e56c631b086c6d8.png

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

fb860c0fa4a02818.png

创建 APN 密钥并将应用注册到 Firebase 项目时,您需要提供软件包标识符。

3. 配置 APNs

创建身份验证密钥

本部分介绍如何为启用推送通知的应用 ID 生成身份验证密钥。如果您有现成的密钥,则可以使用该密钥,而不必生成新的密钥。

如需创建身份验证密钥,请执行以下操作:

  1. 在您的开发者账号中,前往证书、标识符和描述文件,然后前往密钥

19ae87d0f00402b1.png

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

c4acd10dbc4f721f.png

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

6a3e8ff7457a8251.png

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

42c205e072fbd622.png

创建应用 ID

应用 ID 是应用的唯一标识。按照惯例,它由反向域名表示。

  1. 前往 Apple 开发者会员中心并登录。
  2. 前往 Certificates, Identifiers and Profiles
  3. 前往标识符
  4. 点击 + 按钮以创建新的应用 ID。e04fc394c52a866f.png
  5. 选择应用 ID 单选按钮,然后点击继续

d454fd5df3b8d93d.png

  1. 选择应用,然后点击继续

3bd2e836be5e0291.png

  1. 如需创建新的应用 ID,请执行以下操作:
  2. 为您的应用 ID 输入名称
  3. 输入团队 ID。此值必须与“Membership”标签中的 Team ID 匹配。
  4. App ID Suffix 部分,选择 Explicit App ID,然后输入您的 Bundle ID7363c4d1962b486d.png
  5. 应用服务 部分,确保选中 推送通知552ea08703f7e323.png
  6. 点击继续,并检查您输入的内容是否正确:
  7. Identifier 的值应与 Team ID 和 Bundle ID 的合并值相一致
  8. 推送通知应当可以配置
  9. 点击 Register,创建应用 ID。

创建个人资料

要在开发时测试您的应用,您需要为开发环境创建一个配置文件,授权您的设备运行尚未在 App Store 发布的应用。

  1. 前往 Apple 开发者会员中心并登录。
  2. 前往 Certificates, Identifiers and Profiles
  3. 在左上角的下拉菜单中,如果未选择 iOS, tvOS, watchOS,请进行选择,然后前往配置文件
  4. 点击 + 按钮以创建新的配置文件。1fa2342cfe45a925.png
  5. 选择 iOS 应用开发作为配置文件类型,然后点击继续

507434a466220dfe.png

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

4395f04647afa997.png

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

106761fa786ba580.png

  1. 双击配置文件进行安装。

4. 将 Firebase 添加到您的 iOS 项目

创建 Firebase 项目

您必须先创建一个要关联到您的 iOS 应用的 Firebase 项目,然后才能将 Firebase 添加到该 iOS 应用。如需详细了解 Firebase 项目,请访问了解 Firebase 项目

  1. 在 Firebase 控制台中,点击添加项目,然后选择或输入一个项目名称e462afd91c149238.png

如果您已有 Google Cloud Platform (GCP) 项目,则可以从下拉菜单中选择该项目,然后将 Firebase 资源添加到该项目中。

  1. (可选)如果要创建一个新项目,可以修改项目 ID

Firebase 会自动为您的 Firebase 项目分配一个唯一的 ID。如需详细了解 Firebase 如何使用项目 ID,请访问“了解 Firebase 项目”。

  1. 点击继续
  2. 为您的项目设置 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 条款。

1282a798556779ab.png

48ade68c8de27d2.png

  1. 点击创建项目(如果使用现有的 GCP 项目,则点击添加 Firebase)。

Firebase 会自动为您的 Firebase 项目预配资源。完成此过程后,您将进入 Firebase 控制台中 Firebase 项目的概览页面。

在 Firebase 中注册您的应用

有了 Firebase 项目后,您就可以将自己的 iOS 应用添加到其中了。

请访问了解 Firebase 项目,详细了解将应用添加到 Firebase 项目的最佳做法和注意事项,包括如何处理多个 build 变体。

  1. 转到 Firebase 控制台。
  2. 在项目概览页面的中心位置,点击 iOS 图标以启动设置工作流。

如果您已向 Firebase 项目添加了应用,请点击“添加应用”以显示平台选项。

93462beb642e8987.png

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

2e7a00b0008344c1.png

添加 Firebase 配置文件

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

7c5e0a46d07fa9c7.png

如果您的项目中有多个软件包 ID,必须将每个软件包 ID 与 Firebase 控制台中的注册应用相关联,使每个应用都有自己的 GoogleService-Info.plist 文件。

关闭 Xcode。

将 Firebase SDK 添加到您的应用中

我们建议使用 CocoaPods 安装 Firebase 库。不过,如果您不想使用 CocoaPods,可以直接集成 SDK 框架,也可以使用 Swift Package Manager Beta 版。

  1. 如果您没有 Podfile,请创建一个。如果您使用的是快速入门示例,则示例中已提供 Xcode 项目和 Podfile(包含 pod)。
$ cd MessagingExample
$ pod init
  1. 将想要用在应用中的 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'
  1. 安装 pod,然后打开 .xcworkspace 文件,以便在 Xcode 中查看该项目:
$ pod install
  1. 打开 MessagingExample.xcworkspace,然后在 Firebase 控制台中点击下一步6d1f8230d16693e6.png

在应用中初始化 Firebase

您需要为应用添加 Firebase 初始化代码。

导入 Firebase 模块并配置一个共享实例(在快速入门示例中,Firebase 模块已导入)。

  1. UIApplicationDelegate 中导入 Firebase 模块:

AppDelegate.swift

import UIKit
import Firebase // Add this line
  1. 配置一个 FirebaseApp 共享实例(通常在应用的 application:didFinishLaunchingWithOptions: 方法中配置):

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  FirebaseApp.configure() // Add this line
  return true
}
  1. 在 Firebase 控制台中点击下一步f9d37423d346ff0.png
  2. Firebase SDK 已添加到您的应用中。点击继续并前往控制台d1b1309cd3790f66.png

5. 配置 FCM 客户端

上传您的 APNs 身份验证密钥

将您的 APNs 身份验证密钥上传到 Firebase。

  1. 在 Firebase 控制台中,在您的项目内依次选择齿轮图标、项目设置以及 Cloud Messaging 标签页。ba8b5f95241327fe.png
  2. iOS 应用配置下的 APNs 身份验证密钥中,点击上传按钮。357ddc0d4b182492.png
  3. 浏览到您保存密钥的位置,选择该密钥,然后点击打开。添加该密钥的 ID(可在 Apple Developer Member Center 的证书、标识符和个人资料中找到),然后点击上传3dae27f2327daf9e.png

注册接收远程通知

可在启动时或在应用流程中期望的时间点注册您的应用,以便接收远程通知。

在快速入门示例中,已添加 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] 后设置 FIRMessagingdelegate 属性。例如,如果您的应用委托符合消息委托协议,可以将 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):

  1. 点击 Navigator 区域中的项目名称。
  2. 点击签名和功能
  3. 点击 + 功能

eaf41aefb3bf2c9e.png

  1. 双击后台模式
  2. 再次点击 + 功能
  3. 双击推送通知
  4. 后台模式部分中,选中远程通知

e5d0fc08651e04a9.png

6. 发送通知消息

您可以按照以下步骤发送测试消息:

  1. 在目标设备上安装并运行该应用。您需要接受权限请求,才能收到远程通知。
  2. 在 Xcode 日志中获取注册令牌。

a2e49a92f9807d34.png

  1. 确保应用在设备的后台中运行。
  2. 打开通知编辑器,然后选择新建通知
  3. 输入消息内容。f485d7fbd2456ae0.png
  4. 选择发送测试消息
  5. 在标签为添加 FCM 注册令牌的字段中,输入您在第 2 步中获得的注册令牌。
  6. 点击测试

在您点击测试后,目标客户端设备(在后台中运行应用)应该会在通知中心内接收到通知。

如需详细了解发送到您应用的消息,请参阅 FCM 报告信息中心,该信息中心会记录在 iOS 和 Android 设备上发送和打开的消息数量。

6570eea7b5228513.png

7. 恭喜

恭喜,您已成功发送测试消息!

FCM 中还有许多其他功能和配置,例如主题订阅。

如果您对这些功能感兴趣,可以查看官方开发者文档

后续操作

不妨查看以下 Codelab。

深入阅读