版本记录
| 版本号 | 时间 |
|---|---|
| V1.0 | 2021.04.10 星期六 |
前言
Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。Firebase能让你的App从零到一。也就是说它可以帮助手机以及网页应用的开发者轻松构建App。通过Firebase背后负载的框架就可以简单地开发一个App,无需服务器以及基础设施。接下来几篇我们就一起看一下基于Firebase平台的开发。感兴趣的看下面几篇文章。
1. 基于Firebase平台开发(一) —— 基于ML Kit的iOS图片中文字的识别(一)
2. 基于Firebase平台开发(二) —— 基于ML Kit的iOS图片中文字的识别(二)
3. 基于Firebase平台开发(三) —— Firebase基本使用简介(一)
4. 基于Firebase平台开发(四) —— Firebase基本使用简介(二)
5. 基于Firebase平台开发(五) —— Firebase基本使用简介(三)
6. 基于Firebase平台开发(六) —— 基于Firebase Analytics的App使用率的跟踪(一)
7. 基于Firebase平台开发(七) —— iOS的A/B Test(一)
开始
首先我们看下写作内容:
了解如何在您的
SwiftUI iOS应用中使用Firebase Cloud Messaging发送和接收远程推送通知。内容来自翻译。
接着看下写作环境:
Swift 5, iOS 14, Xcode 12
接着就是正文啦。
人们与应用程序进行交互的方式因人而异。这可能使您很难知道您的客户何时使用您的应用程序,尤其是在您需要向他们提供重要信息时。推送通知(Push notification)提供了一种统一,一致的方式来通知您的应用程序用户几乎所有内容。
要接收推送通知,您的设备需要通过接收唯一的device token向Apple Push Notification service (APNs)注册。注册设备后,您可以通过使用device token向APNs发送请求来向设备发送推送通知。所有这些通信都需要通过某种Web服务器进行。
您可以实现自己的Web服务来与APNs通信,但是有更简单的选择。其中之一是Firebase Cloud Messaging(FCM)。有了Firebase Cloud Messaging(FCM),您就可以轻松使用易于使用的系统! FCM处理push notifications的云方面,使您无需编写自己的Web服务即可发送和接收推送。
在本教程中,您将学习如何:
- 设置您的
SwiftUI应用,以使用Swift Package Manager通过Google的Firebase Cloud Messaging接收推送通知 - 通过
media发送通知 - 接收基于主题的通知
- 通过
push notification的内容向您的应用添加信息 - 获取有关推式通知打开频率的信息
要继续学习本教程,您需要:
- 付费的
Apple Developer Program会员资格,可在您的应用程序中使用push notifications - 一个Google Firebase帐户。您无需支付任何费用即可完成本教程。如果您选择在生产环境中使用
Firebase,则可以在关联的站点上找到定价信息pricing information。 - 物理
iOS或iPadOS设备,因此您可以接收推送通知
注意:虽然您可以在模拟器上测试本地推送通知,但是您需要在物理设备上运行才能从
FCM接收推送通知。
您将使用的应用程序Good News为用户提供了一个只有好消息的新闻提要。 这是因为即使世界上发生了坏事,也要记住也要发生好事!
在启动文件夹中,打开GoodNews.xcodeproj。 打开Project navigator,然后选择Good News target。 在Signing & Capabilities选项卡中,选择您的开发团队,然后输入一个新的Bundle Identifier。 现在,可以在真实设备或模拟器上进行构建和运行。

您会看到该应用程序具有用于向用户显示新闻文章的feed,以及一个供用户选择订阅主题的标签。
Configuring Firebase
接下来,您将学习如何配置Firebase。
1. Creating the p8 Certificate
Firebase要求您将p8证书上传到您的应用程序。 这是一个特殊文件,其中包含允许Firebase发送通知的私钥。 要获取p8证书,请登录Apple Developer。
选择Certificates, Identifiers & Profiles,然后转到Keys。 选择圆圈+按钮以创建新的key。

给它命名并启用Apple Push Notifications service (APNs)服务。 选择Continue,然后在下一个屏幕上选择Register。

请务必在此屏幕上记下以下三个项目:
- 选择
Download将p8文件保存在本地。 您需要将其上传到Firebase。 退出此屏幕后,您将无法下载此文件(You cannot download this after leaving this screen)。 - 将
Key ID复制并保存到文件中。 - 复制并保存您的
Apple membership ID。 该名称位于Membership Center右上角下的您的姓名旁边或Membership Details下面。

2. Setting up the Firebase Project
接下来,转到您的Firebase帐户,然后选择页面右上角的Go to console。 选择Add project,然后执行以下操作来创建您的项目:
- 使用名称
Good News。 - 启用
Google Analytics。 - 选择
Google Analytics的名称和国家/地区。 - 使用默认的分析设置。
注意:如果您不需要跟踪用户与推送通知的交互方式,则可以禁用
Google Analytics(分析)并跳过设置。
然后,您需要使用Apple p8和会员信息配置Firebase。 在您的Firebase项目中,选择Project Overview旁边的齿轮,然后选择Project settings:

接下来,在项目设置的General部分下设置一个iOS应用:

从那里转到应用程序配置页面:
- 为您的项目添加
Bundle Identifier。 - 如果需要,可以将
App nickname和App Store ID保留为空白。
注册您的应用程序后,下载GoogleServices-Info.plist。 稍后,您需要使用此功能在您的应用中配置Firebase。 您可以为其余步骤选择Next。 您将不会使用CocoaPods,并且现在您可以忽略将初始化代码添加到您的应用程序的步骤。
接下来,转到Firebase项目设置中的Cloud Messaging,上传您的p8证书。 在APNs Authentication Key下,选择Upload。

您会看到一个弹出窗口,要求您:
- 上载从Apple下载的
.p8文件。 - 输入创建
p8时保存的Key ID。 - 输入您的
Apple membership ID。
选择Upload以完成Firebase项目的设置。
3. Adding the Package
现在,您将使用Swift Package Manager将Firebase依赖(dependency)项添加到您的项目中。在Xcode中,选择File ▸ Swift Packages ▸ Add Package Dependency…。在Choose Package Repository弹出窗口中,输入https://github.com/firebase/firebase-ios-sdk.git。
选择Next,保留默认选项,直到出现包含软件包列表的屏幕。 Xcode下载必要的数据时可能会花费一些时间。从列表中选择以下软件包:
FirebaseAnalyticsFirebaseMessaging
如果您不想收集有关用户如何使用推送通知的信息,请随时取消选中FirebaseAnalytics。添加这些软件包后,可能需要花费几分钟来添加和构建依赖关系。
注意:在撰写本文时,
Firebase的最新版本是7.3。
接下来,将GoogleService-Info.plist添加到您的Xcode项目的Assets组中的项目:

最后,您可以开始向您的应用添加代码!
4. Configuring Your App
首先打开Info.plist并添加以下条目:
- Key: FirebaseAppDelegateProxyEnabled
- Type: Boolean
- Value: NO (Xcode will show this as 0)

默认情况下,FirebaseMessaging使用method swizzling处理推送通知。 您将自己处理所有代码,因此请使用刚添加的plist条目将其关闭。
接下来,您将一个app delegate添加到您的项目中,该委托将负责设置push notifications。 创建一个名为AppDelegate.swift的新文件,并将其代码替换为以下代码:
import UIKit
import Firebase
import FirebaseMessaging
import FirebaseAnalytics
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
return true
}
}
在上面的代码中,您首先导入必要的Firebase框架,然后实现UIApplicationDelegate协议。
接下来,在AppMain.swift中的AppMain中添加一个新属性:
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
这将使SwiftUI知道您新创建的应用程序代理。 现在,您可以开始配置Firebase。
5. Launching Firebase
在return之前,再次打开AppDelegate.swift并将以下内容添加到application(_:didFinishLaunchingWithOptions :)中:
// 1
FirebaseApp.configure()
// 2
FirebaseConfiguration.shared.setLoggerLevel(.min)
这是这样做的:
- 1) 它将您的应用程序配置为可与
Firebase一起使用。 - 2) 它设置
Firebase将记录的数量。 将此设置为min会减少您在调试器中看到的数据量。
由于您不希望Firebase通过swizzling自动处理notification code,因此您需要遵守UNUserNotificationCenterDelegate。 将以下内容添加到AppDelegate.swift的末尾:
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler:
@escaping (UNNotificationPresentationOptions) -> Void
) {
completionHandler([[.banner, .sound]])
}
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
completionHandler()
}
}
当通知到达或用户与之交互时,用户通知中心将调用这些方法。 您稍后再与他们合作。
6. Registering for Notifications
在配置了Firebase的情况下,您可以开始注册以接收通知。 将以下方法添加到UNUserNotificationCenterDelegate扩展中:
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
Messaging.messaging().apnsToken = deviceToken
}
当用户授予推送通知权限时,APNs将生成并注册token。 该token标识单个设备,因此您可以向其发送通知。 您将使用Firebase分发通知,此代码使该token在Firebase中可用。
现在,您可以在return之前将以下内容添加到application(_:didFinishLaunchingWithOptions :)中:
// 1
UNUserNotificationCenter.current().delegate = self
// 2
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions) { _, _ in }
// 3
application.registerForRemoteNotifications()
代码是这样的:
- 1) 将
AppDelegate设置为UNUserNotificationCenter的代理。 在上一步中,您实现了必要的代理方法。 - 2) 创建与您的应用程序将请求哪种推送通知权限相关的选项。 在这种情况下,您需要
alerts, badges and sound。 - 3) 注册您的应用以获取远程通知。
接下来,在文件底部添加以下扩展名:
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
let tokenDict = ["token": fcmToken ?? ""]
NotificationCenter.default.post(
name: Notification.Name("FCMToken"),
object: nil,
userInfo: tokenDict)
}
}
Messaging是Firebase的类,用于管理与推送通知相关的所有内容。 像许多iOS API一样,它具有一个称为MessagingDelegate的代理,您可以在上面的代码中实现该代理。 每当您的应用程序启动或Firebase更新您的token时,Firebase都会调用您刚添加的方法以使应用程序与其保持同步。
现在,在return之前,将以下内容添加到application(_:didFinishLaunchingWithOptions :):
Messaging.messaging().delegate = self
这会将AppDelegate设置为Messaging的代理。
您已经很接近了 —— 仅需一步就可以准备好您的应用。 在Xcode中,打开应用程序的项目设置,然后转到Signing & Capabilities。 选择+ Capability按钮。 在字段中搜索Push Notifications,然后按Enter。

7. Sending Notifications
您的应用现在可以接收通知了! 在真实设备上构建并运行。 它的外观应与以前相同,但带有alert,要求您允许向您发送通知。 确保选择Allow。

现在,转到您的Firebase项目,然后选择在Engage下找到的Cloud Messaging。 然后选择Send your first message。

在Step 1下,输入以下内容:
Notification title: Notification TestNotification text: This is a test
接下来,从Step 2的下拉列表中选择您的应用:

使用Cloud Messaging控制台时,这将针对您的特定应用程序。
最后,选择Review,然后选择Publish。 在您的设备上,您会看到以下通知:

注意:如果您没有收到通知,请按照说明进行操作,以完成所有设置。 您可能错过了设置或无法上传
.p8文件。 此外,您可以在AppDelegate.swift中实现application(_:didFailToRegisterForRemoteNotificationsWithError :),以打印出注册通知期间可能发生的任何错误。
Sending Data in Notifications
Firebase使通过Cloud Messaging控制台轻松发送通知中的其他数据成为可能。 在下一部分中,您将向通知有效内容中添加数据,以便在通知到达时向新闻源中添加新闻故事。
首先,在AppDelegate.swift中,在UNUserNotificationCenterDelegate扩展内添加以下代码:
private func process(_ notification: UNNotification) {
// 1
let userInfo = notification.request.content.userInfo
// 2
UIApplication.shared.applicationIconBadgeNumber = 0
if let newsTitle = userInfo["newsTitle"] as? String,
let newsBody = userInfo["newsBody"] as? String {
let newsItem = NewsItem(title: newsTitle, body: newsBody, date: Date())
NewsModel.shared.add([newsItem])
}
}
这是您添加的内容:
- 1) 这将在
notification payload中获取所需的信息。 - 2) 如果
userInfo具有创建新闻项的值,则此代码创建一个新闻项并将其添加到启动程序项目的新闻提要中。
然后,在调用completionHandler之前,将以下内容添加到userNotificationCenter(_:willPresent:withCompletionHandler :):
process(notification)
每当您在应用程序处于前台时收到通知时,都会调用userNotificationCenter(_:willPresent:withCompletionHandler :)。 这样可以确保在用户使用您的应用程序时,在收到新通知时添加新闻项。
然后,在调用completionHandler之前,将以下代码添加到userNotification(_:didReceive:withCompletionHandler :):
process(response.notification)
用户点击通知时将调用userNotification(_:didReceive:withCompletionHandler :)。 同样,只要发生这种情况,您都会添加一个新闻项目。
构建并运行。 该应用看起来与以前相同,但可以处理其他通知数据。
返回控制台,创建一个新的通知。 和以前一样,输入通知标题和文本,然后选择您的应用程序。 然后转到Step 5,并在Custom data下添加以下项目:
Key: newsTitleValue: Child Saves Kittens
这将向应用程序发送标题。 现在,添加主体的条目:
Key: newsBodyValue: Local child saves kittens from a tall tree
您添加的键和值将作为通知的userInfo发送,您将在process(_:)中进行解析。 发送通知。 如果您打开了应用程序,或者在到达通知时点按了通知,则您将在Feed中看到新的新闻项。

还可以处理来自后台进程的通知,而无需用户进行任何交互。 虽然这不在本教程的讨论范围之内,但我们的 Push Notifications video course 视频课程以及Push Notifications by Tutorials book 一书涵盖了对推送通知和其他许多主题的后台处理。
Subscribing to Topics
Firebase Cloud Messaging的另一个功能是订阅主题,这是一种使用户灵活自定义通知的好方法。 Firebase允许您使用主题标记特定的推送通知。 然后,您可以为您的用户订阅不同的主题。 例如,也许用户对诸如直接消息之类的重要通知感兴趣,但无需通知您应用程序feed中新的投递。 或者,您可以让您的用户关注特定的帖子或人员,接收有关群聊的推送通知,等等。
幸运的是,这很容易做到。 首先,打开TopicsModel.swift并在顶部添加以下导入:
import FirebaseMessaging
入门项目包括一个开关,该开关使用户可以切换他们感兴趣的主题。您将这些开关连接到Firebase。
用以下代码替换subscribe(to :)和unsubscribe(from :):
private func subscribe(to topic: String) {
// 1
Messaging.messaging().subscribe(toTopic: topic)
}
private func unsubscribe(from topic: String) {
// 2.
Messaging.messaging().unsubscribe(fromTopic: topic)
}
就是这样! 这是您添加的内容:
- 1) 当用户打开主题开关时,此代码将要求
Firebase订阅该主题。 - 2) 当用户关闭主题关闭时,此代码将要求
Firebase取消订阅该主题。
构建并运行。 然后,转到Topics选项卡并打开Pets开关。

在控制台中,通过选择通知最右边的三个点来复制上一步的通知:

保留所有相同的内容,除了Step 2。将User Segment更改为Topic,然后为Message topic输入pets:

现在,这只会向打开Pets切换开关的用户发送通知。发送通知,您将看到上一部分中的所有操作。再次复制通知,然后将主题更改为family并发送。由于您的应用未订阅该主题,因此Firebase不会将通知发送到您的设备。
Sending Images
到目前为止,您的通知都只包含文本。但是,如果您收到了很多通知,则知道通知可以包含丰富的内容,例如图像。如果您的通知向用户显示了与其内容相关的漂亮图片,那将是很好的选择。 Firebase再一次使此超级简单。
1. Adding a Notification Service Extension
要在push notifications中显示图片,您需要创建一个Notification Service Extension。这是您应用中的一个单独target,当您的用户收到推送通知时,该target将在后台运行。在iOS向用户显示通知之前,服务扩展(service extension)可以接收通知并更改其内容。您将使用Firebase在通知内发送图片网址。然后,您将使用内容扩展程序下载图片并将其添加到通知的内容中。
在Xcode中,转到File ▸ New ▸ Target…。搜索Notification Service Extension,然后选择Next。将名称设置为Good News Notifications,并将其配置为添加到项目Good News中,并嵌入到应用程序Good News中,如下面的屏幕截图所示:

选择Finish,然后在出现提示时选择Activate。
当您将Firebase程序包添加到项目中时,它只是添加到了Good News target中,因此现在您需要向新的扩展程序中添加必要的依赖项。 打开应用程序的项目设置,然后在Targets下选择Good News Notifications。 在Frameworks and Libraries下,选择+按钮,然后搜索FirebaseMessaging。 然后,选择Add。 您的项目应反映以下图像:

2. Customizing Notifications
现在,打开NotificationService.swift。 在该文件中,您可以在用户看到通知之前自定义通知。
首先,将以下导入添加到文件顶部:
import FirebaseMessaging
接下来,将didReceive(_:withContentHandler :)的内容替换为以下内容:
self.contentHandler = contentHandler
bestAttemptContent = request.content
.mutableCopy() as? UNMutableNotificationContent
guard let bestAttemptContent = bestAttemptContent else { return }
FIRMessagingExtensionHelper().populateNotificationContent(
bestAttemptContent,
withContentHandler: contentHandler)
通常,您必须搜索包含图像URL的字段,下载图像,然后以图像作为附件完成演示。在这里,您正在使用Firebase的FIRMessagingExtensionHelper通过一个简单的helper方法调用自动执行所有工作。
请记住,iOS仅给您有限的时间来下载附件图像。如果扩展程序的代码花费的时间太长,系统将调用serviceExtensionTimeWillExpire()。这使您有机会优雅地完成扩展中正在执行的所有操作,或仅按原样显示通知,这是默认实现。
确保Good News是您的active target,然后进行构建和运行。该应用程序应与以前的外观相同。
返回Firebase Cloud Messaging控制台,重复最后几步中您一直在使用的有关kittens的通知。确保您没有使用主题设为family的主题,因为您的应用未订阅该主题。
这次,在Notification image图像下的Step 1中,添加以下URL:https://koenig-media.raywenderlich.com/uploads/2021/01/good_news_petsicon.png。
您的控制台应显示如下:

发送您的通知。 在您的设备上,您会看到一条带有kitten图片的通知,如下所示:

Analytics
现在,您正在发送和处理通知,请考虑了解用户如何与您的通知进行交互的重要性。 他们完全忽略了他们吗? 他们会定期打开吗? 借助Firebase Analytics和Cloud Messaging,您可以跟踪通知周围的事件。
到目前为止,您还缺少处理通知的一个步骤:将您收到的通知告知Firebase。 在AppDelegate.swift中,在方法末尾将以下内容添加到process(_ :):
Messaging.messaging().appDidReceiveMessage(userInfo)
构建并运行。 然后,停止调试并关闭您的应用程序。 接下来,在Cloud Messaging控制台中复制您先前的通知并发送。 收到通知后,请点击它以打开您的应用程序。
在Cloud Messaging控制台中打开通知。 它将显示Sends计数,如下所示:

1. Tracking Custom Events
既然您的应用程序正在通知Firebase收到了通知,那么Opens次数也可能会有所增加。但是,这个数字不太可能会增加。您最多可能需要24小时才能在Firebase控制台中看到分析信息得到处理并呈现给您。实际上,即使之后,您也可能根本看不到这个数字的增加。在撰写本文时,Google可以针对iOS和Android通知进行报告的内容受到限制。没关系-您仍然可以利用Google Analytics(分析)并跟踪自定义事件。
注意:本教程的此部分不是
push notifications起作用所必需的。如果您不希望跟踪用户与推送通知的交互方式,请随时跳过此部分。如果您之前跳过了设置分析的步骤,则需要添加所需的程序包,并设置Firebase应用程序进行分析,然后再继续。
在AppDelegate.swift中,在NewsModel.shared.add([newsItem])之后紧接在process(_:)中添加以下代码行:
Analytics.logEvent("NEWS_ITEM_PROCESSED", parameters: nil)
此代码使用Firebase的Analytics(分析)来跟踪您是否已将新闻项添加到Feed中。 现在,在Messaging.messaging().appDidReceiveMessage(userInfo)之后添加以下代码行:
Analytics.logEvent("NOTIFICATION_PROCESSED", parameters: nil)
这将记录一个事件,说明您已处理该通知,无论该通知是否包含新闻项。
构建并运行。 再一次在Cloud Messaging控制台中复制您的通知并发送。 返回Firebase中,在Analytics下选择Events。 在这里,您将开始看到事件显示,如下所示:

在此示例中,您仅看到NEWS_ITEM_PROCESSED的条目。 这是因为Google尚未完成对该应用程序的分析处理。 同样,在跟随本教程的同时,您不太可能会在帐户中看到这两个事件中的任何一个。 让数小时到一天过去,然后再次检查。
现在,您可以使用Firebase Cloud Messaging发送和接收通知! 您也熟悉Firebase Analytics,可以从Google或Firebase Analytics: Getting Started。
如果您正在寻找如何开始使用Android上的推送通知,请查看Firebase Cloud Messaging for Android: Sending Push Notifications教程。
要了解有关没有Firebase的iOS上的推送通知的更多信息,请查看 Push Notifications Tutorial: Getting Started。
如果您想深入了解推送通知并查找提供的所有内容,请查看我们的Push Notifications video course 课程以及Push Notifications by Tutorials book。
后记
本篇主要讲述了使用
Firebase Cloud Messaging进行Push Notification的发送和接收,感兴趣的给个赞或者关注~~~
