版本记录
版本号 | 时间 |
---|---|
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
下载必要的数据时可能会花费一些时间。从列表中选择以下软件包:
FirebaseAnalytics
FirebaseMessaging
如果您不想收集有关用户如何使用推送通知的信息,请随时取消选中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 Test
Notification 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: newsTitle
Value: Child Saves Kittens
这将向应用程序发送标题。 现在,添加主体的条目:
Key: newsBody
Value: 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
的发送和接收,感兴趣的给个赞或者关注~~~