iOS 开发者喜欢幻想人们一直在运用他们的运用。可是,当然,用户也会不得不封闭运用并处理其他事务。究竟衣服不会自己叠,你知道的! 令人高兴的是,推送告诉答应开发者向用户发送音讯,即运用户当时没有在运用运用!在本教程中,您将学习怎么:
- 装备您的运用程序以接纳推送告诉;
- 将其显现给您的用户或履行其他使命。
开端
什么是推送告诉?它们是经过 Apple 推送告诉服务 (APNs) 发送给运用程序的音讯,即便运用程序没有运转或手机处于睡觉状况。那么,你能够运用推送告诉做什么?
- 显现一条简略的音讯,称为 “Alert”,以引起人们对运用程序中新内容的重视。
- 播映告诉声响。
- 在运用程序的图标上设置一个角标数字,让用户知道运用中有新的内容。
- 让用户能够在不翻开运用的状况下进行操作。
- 显现一个媒体附件。
- 发送静默推送告诉,让运用程序在后台履行使命。
- 将告诉分组到线程中。
- 修改或删去已发送的告诉。
- 在显现告诉前运转代码以更改告诉。
- 为你的告诉显现一个自界说的可交互式 UI。
- 或许还有更多。
本教程涵盖了许多方面,以帮助您开端在您的运用程序中创立推送告诉。要完本钱教程,您需求以下条件:
- Xcode 11.4 或更高版本。前期版本的 Xcode 不支持运用模仿器推送告诉。
- 一个 Apple Developer Program 账号,以便能够开启推送告诉功用并编译运用程序。
注:在后面的教程中,您将学习 Sending to a Real Device 向实在设备发送推送告诉。
要发送和接纳推送告诉,您有必要履行三项主要使命:
- 装备您的运用程序并将其注册到 APNs。
- 经过 APNs 从服务器向特定设备发送推送告诉。你将用 Xcode 来模仿。
- 在运用程序中运用回调来接纳和处理推送告诉。
发送推送告诉音讯是你的运用程序的服务端的使命。许多运用程序运用第三方服务来发送推送告诉。其他运用程序则运用自界说处理计划或流行的库(如 houston)。在本教程中,您将只触及到发送推送音讯,所以必定要查看 Where to Go From Here? 部分,以建立您对推送告诉的概念知识。
要开端本教程,请运用本教程顶部或底部的下载材料按钮下载 WenderCast 初始化项目。WenderCast 是大家获取 raywenderlich.com 播客和突发新闻的首选来源。
在 starter 文件夹中,翻开 WenderCast.xcodeproj。在项目导航中挑选 WenderCast,然后挑选 WenderCast target。在 General & Capabilities 选项卡中,修改为你的开发帐户。构建并在模仿器中运转。
WenderCast 会显现 raywenderlich.com 播客的列表,并让用户播映它们。但它不会让用户知道什么时候有新的播客,而且 “News” 选项卡是空的! 你很快就会经过推送告诉的力量来处理这些问题。
发送和接纳推送告诉
装备 App
安全性关于推送告诉来说是十分重要的。您不希望其他人经过您的运用程序向您的用户发送推送告诉。您需求履行几个使命来装备您的运用程序以安全地接纳推送告诉。
开启推送告诉服务
首要,你有必要修改运用程序 bundle ID(bundle identifier)。在 Xcode 项目导航栏中高亮选中 WenderCast,然后挑选 WenderCast target。挑选 General,然后将 Bundle Identifier 改为共同的东西,这样 Apple 的推送告诉服务器就能够直接推送到这个运用程序。
接下来,你需求在你的开发者账户中创立一个App ID,并开启推送告诉权限。Xcode 有一个简单的办法来完结这一点。在 WenderCast target 仍然被选中的状况下,点击 Signing & Capabilities 选项卡,然后点击 + Capability 按钮。在过滤器字段中输入 “push”,然后按 Enter 键。
增加推送告诉权限后,你的项目应该是这样的:
留意:假如出现任何问题,请访问 Apple Developer Center。你或许需求同意苹果喜欢更新的开发者授权,然后再试一次。
在以上操作的背面,会主动创立 App ID,然后为其增加推送告诉权限。你能够登录苹果开发者中心查看验证:
这便是你现在需求装备的一切内容。你能够开端增强运用程序了。
向用户恳求告诉权限
注册推送告诉时,你需求履行两个进程。首要,您有必要向用户申请并取得显现告诉的权限。然后,你能够注册设备来接纳长途(推送)告诉。假如一切顺利,体系就会给你供给一个设备令牌(device token),你能够把它看作是这个设备的”地址”。
在 WenderCast 中,你会在运用发动后当即注册推送告诉。先问询用户权限。
翻开 AppDelegate.swift,在文件顶部增加以下内容。
import UserNotifications
然后,在 AppDelegate
的结束增加以下办法:
func registerForPushNotifications() {
// 1. 注册推送告诉,向用户恳求告诉权限
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, _) in
print("Perission granted: (granted)");
}
}
这段代码的作用:
-
UNUserNotificationCenter
处理运用程序中一切与告诉相关的活动,包括推送告诉。 - 你调用
requestAuthorization(options:completionHandler:)
向用户恳求授权以显现告诉。传递的选项表明您希望您的运用程序要运用的告诉类型–这儿您恳求的是警报、声响和角标。 - 完结处理程序会收到一个 Bool 类型的回来值,表明授权是否成功。在这种状况下,你只需打印结果。
留意:您传递给
requestAuthorization(options:completionHandler:)
的参数能够包括UNAuthorizationOptions
枚举类型的任意组合。
- .badge: 在运用程序图标的旮旯上显现一个数字。
- .sound: 播映一个声响。
- .alert: 显现一个文本告诉。
- .carPlay:在CarPlay中显现告诉。
- .provisional:暂时告诉。发布不间断的告诉。假如你只运用这个选项,用户不会收到权限恳求,你的告诉只会静静地显现在告诉中心。
- .providesAppNotificationSettings。表明运用有自己的 UI 进行告诉设置。
- .criticalAlert:紧迫告诉,忽略体系静音开关和勿扰模式。你需求苹果公司的特别授权才干运用这个选项,由于它只针对十分特别的用例( 盲猜,地震警报?台风?海啸?火山爆发紧迫告诉,家人之间的 SOS 告诉)。
在 application(_:didFinishLaunchingWithOptions:)
的结束处,在 return
之前增加以下内容:
registerForPushNotifications()
在这儿调用 registerForPushNotifications()
办法能够保证运用程序在任何时候发动时都会测验注册推送告诉。
构建并运转运用。当运用程序发动时,您应该收到一个提示,要求答应向您发送告诉。
点击答应,然后,该运用现在能够显现告诉了。很好!可是假如用户拒绝了这个权限怎么办?在 AppDelegate
中增加这个办法:
// 获取告诉设置
func getNotificationSettings() {
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
print("Notification settings: (settings)")
}
}
首要,你指定了你想要的设置。这个办法回来用户现已颁发的设置。现在,你正在打印它们,但你很快就会回到这儿,用这个来做更多的作业。
在 registerForPushNotifications()
办法中,将调用 requestAuthorization(options:completionHandler:)
替换为以下内容:
func registerForPushNotifications() {
// 1. 注册推送告诉,向用户恳求告诉权限
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { [weak self] (granted, _) in
print("Perission granted: (granted)");
guard granted else { return }
self?.getNotificationSettings()
}
}
你在完结处理程序中增加了对 getNotificationSettings()
办法的调用。这一点很重要,由于用户能够在任何时候进入体系设置中更改他们的告诉权限。guard
能够避免在没有颁发权限的状况下调用该办法。
向 APNs 注册
现在你有了推送告诉权限,你就能够注册长途告诉了!
在 getNotificationSettings()
办法中,在闭包中的 print
下面增加以下内容:
guard settings.authorizationStatus == .authorized else { return }
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
在这儿,你要验证 authorizationStatus
是 .authorized
。表面用户现已颁发了告诉权限。假如是,你调用UIApplication.shared.registerForRemoteNotifications()
来发动 Apple Push Notification 服务的注册。你需求在主线程上调用这个,不然你会收到一个运转时警告。
在 AppDelegate
的结束增加以下内容。
// 向 APNs 注册成功时调用,回来设备标识符
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) }
let token = tokenParts.joined()
print("Device Token: (token)")
}
每当调用 registerForRemoteNotifications()
成功时,iOS 就会调用这个办法。这段代码或许看起来很神秘,但它仅仅将接纳到的 deviceToken
转换为字符串。设备令牌是这个进程的效果。它由 APNs 供给,并在这个特定的设备上仅有地标识这个运用。
当发送推送告诉时,服务器运用令牌作为目标 “地址” 来传递给正确的设备。在你的运用中,你现在会将这个令牌发送到服务器上保存,并在以后用于发送告诉。
现在增加以下代码:
// 向 APNs 注册失利时调用
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("Failed to register:(error)")
}
假如 registerForRemoteNotifications()
办法履行失利,iOS 会调用这个办法。你现在仅仅在打印错误。
便是这样!构建并运转。由于你是在模仿器上,你会看到一个注册失利的错误。你能够暂时忽略它。稍后,当你在实在设备上运转时,你应该会在控制台输出中收到一个 token。下面是一个比如:
留意:注册失利或许有多种原因。大多数状况下,这是由于 App ID 没有正确装备。错误信息通常会带有很好的提示,说明问题所在。
发送模仿推送告诉
运用文本修改器创立一个名为 first.apn 的文件,你将把它传递给 Xcode 的 simctl 东西。张贴以下 JSON 文本并保存文件。
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
这个 JSON 的结构将在下一节解说。请耐心点,小蚂蚱。
在模仿器上再次构建并运转运用,然后将运用切换到后台或确定设备。运用在前台时还不能处理推送告诉。
要运用 simctl,你需求知道你正在运转运用的模仿器的设备标识符。假如模仿器中只运转一个设备,你能够运用 booted 代替标识符。要取得标识符,在 Xcod e中,挑选 Windows ▸ Devices and Simulators,然后挑选顶部的 Simulators 选项卡,并从左边的列表中挑选你正在运用的模仿器。运用鼠标仿制标识符。您或许需求扩展对话框才干彻底看到它。
翻开 Terminal 运用程序,运用 booted 或 Xcode 中的设备标识符代替 device_identifier 键入以下指令:xcrun simctl push device_identifier bundle_identifier first.apn
。将 device_identifier
替换为你从 Xcode 中仿制的设备标识符,将 bundle_identifier
替换为运用程序的 bundle 标识符–你第一次设置项目时运用的标识符。下面是一个比如。
运转该指令,你会看到推送告诉出现在模仿器上!
点击告诉,运用程序就会发动。
这难道不是很帅吗?
查看基本的推送告诉
在你继续处理推送告诉之前,先看看你发送的告诉音讯:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
有用载荷是一个 JSON 字典,其间至少包括一个 aps
项,它也是一个字典。在这个比如中,aps
包括字段 alert
、sound
和 link_url
。当设备收到这个推送告诉时,会显现一个带有 “Breaking News!” 文字的警报弹窗视图,并播映规范的音效。
link_url
实际上是一个自界说字段。你能够像这样在有用载荷中增加自界说字段,它们会被传递到你的运用程序中。由于你还没有在运用内部处理它,所以这个键值对现在没有任何作用。
更正:一位敏锐的读者指出,苹果公司的文档 中规则,
link_url
等自界说内容应该与aps
字典条目处于同级,而不是在其内部。虽然你把它放在里边,它也仍然能够作业,但咱们总是建议遵守苹果的文档,并将在咱们下一次更新本教程时纠正这一点。
有八个内置的 key 能够增加到 aps
字典中(更多信息请拜见官方的 Payload Key Reference):
- alert: 这能够是一个字符串,就像前面的比如,也能够是一个字典。作为一个字典时,它能够将 text 本地化或改变告诉的其他方面。
- badge:这是一个数字,将显现在运用程序图标右上角(角标)。您能够经过将其设置为0来删去角标标记。
- sound:这是自界说告诉声响的文件名。坐落运用程序中的自界说告诉声响的文件名。这些声响有必要短于 30 秒。
- thread-id:运用此键对告诉进行分组。
- category:这界说了告诉的类别,用于在告诉上显现自界说操作。你将很快探究这个问题。
- content-available:静默告诉,经过将此键设置为 1,推送告诉就会变得无声。你将在下面的 “静默推送告诉” 部分了解到这一点。
- mutable-content:经过将这个键设置为 1,你的运用程序能够在显现之前修改告诉。
- target-content-id:这是带来的窗口的标识符。
除此之外,你能够增加尽或许多的自界说数据,只要有用载荷不超越 4,096 字节。
一旦你有足够的趣味,测验这些选项并发送推送告诉到你的模仿器,然后开启下一节!
处理推送告诉
在本节中,您将学习当运用程序收到告诉而且用户点击告诉时怎么履行操作。
了解当推送告诉抵达时产生了啥
当你的运用收到推送告诉时,iOS 会调用 UIApplicationDelegate
中的一个办法。
你需求根据「收到告诉时你的运用处于什么状况」来处理告诉。
- 假如你的运用没有运转,用户经过点击推送告诉来发动它,iOS 会在
application(_:didFinishLaunchingWithOptions:)
的launchOptions
中把告诉传递给你的运用。 - 假如你的运用是在前台或后台运转,体系会经过调用
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
来告诉你的运用。当用户经过点击推送告诉翻开运用时,iOS 或许会再次调用这个办法,这样你就能够更新 UI 并显现相关信息。
在第一种状况下,WenderCast 会创立新闻项目,并直接翻开新闻标签。在 AppDelegate.swift
中,在application(_:didFinishLaunchingWithOptions:)
的结束,在回来句子之前增加以下代码:
// 当收到推送告诉时,假如运用没有运转,用户点击推送告诉音讯
// 推送音讯内容从此办法传递进来
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UITabBar.appearance().barTintColor = UIColor.themeGreenColor
UITabBar.appearance().tintColor = UIColor.white
// 注册推送告诉
registerForPushNotifications()
// 查看是否经过告诉发动
let notificationOption = launchOptions?[.remoteNotification]
// 1
if let notification = notificationOption as? [String: AnyObject],
let aps = notification["aps"] as? [String: AnyObject] {
// 2
NewsItem.makeNewsItem(aps)
// 3
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
}
return true
}
这便是你正在做的作业:
- 查看
UIApplication.LaunchOptionsKey.remoteNotification
的值是否存在于launchOptions
中。假如存在,那么你的运用是从告诉中发动的。这儿面就会包括你发送的推送告诉的有用载荷。 - 由于
aps
字典存在,用它创立一个NewsItem
。 - 将标签控制器的
selectedIndex
索引定位到新闻页面。
为了测验,你需求修改 WenderCast 项目的 scheme 。首要,在模仿器上构建并运转以装置最新的代码。然后,点击 WenderCast 的 schema,挑选 Edit Scheme… 修改计划。
从侧边栏挑选 Run,然后在 Info 选项卡中挑选 Wait for executable to be launched(等候可履行文件发动)。
这个选项会在装置运用时,等候运用第一次发动后(运用不会自发动),再让 debugger 调试器附加到运用上。
构建并运转。装置完结后,像之前相同用 xcrun simctl
发送更多的突发新闻。点开告诉,运用就会翻开新闻。
要处理您的运用程序在收到推送告诉时正在运转的状况,请向 AppDelegate 增加以下内容:
// 当运用收到推送告诉时,处理收到的推送告诉内容
// 无论运用此时处于前台仍是后台,都会调用此办法!
// 默许状况下,假如运用收到推送告诉时处于前台状况,则会丢掉告诉内容
// 这儿能够截获推送内容,并更新运用页面
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let aps = userInfo["aps"] as? [String: AnyObject] else {
completionHandler(.failed)
return
}
NewsItem.makeNewsItem(aps)
}
以上代码测验从回来参数的 userInfo
目标中提取 aps
,假如成功,则创立一个新的 NewsItem
。
由于 iOS 会在运用运转时调用这个办法,所以你需求将 scheme 改回主动发动运用来测验。在 Scheme 计划修改器中,在 Launch 下,挑选 Automatically。
构建并运转。坚持运用在前台运转状况,将页面停留在新闻标签上。发送另一个新闻推送告诉,并观察它是否出现在 feed 中。
便是这样!你的运用程序现在能够神奇地接纳突发新闻的产生 :]
留意:推送告诉不能保证抵达。这关于 WenderCast 来说是可接受的,由于拥有完好的新闻列表关于这个运用来说并不太重要。不过一般来说,你不应该将推送告诉作为传递内容的仅有方式。相反,推送告诉应该发出有新内容可用的信号,并让运用程序从源头(例如,从REST API)下载内容。
增加可操作的告诉
可操作的告诉能够让你在告诉本身上增加自界说按钮。你或许现已留意到了这一点,在电子邮件告诉或推特上,能够直接在告诉上 “回复 “或 “保藏”。
当你注册告诉时,你的运用能够经过运用 categories 来界说可操作告诉。每个类别的告诉都能够有一些预设的自界说动作。
注册后,你的服务器能够设置推送告诉的类别。当用户收到告诉时,就能够进行相应的操作。
关于 WenderCast 运用来说,你会界说一个 News 类别,并有一个名为 View 的自界说动作。假如用户挑选这个动作,它将答运用户在运用中查看新闻文章。
在 registerForPushNotifications()
办法中,在 guard 和调用 getNotificationSettings()
办法之间刺进以下内容:
func registerForPushNotifications() {
// 1. 注册推送告诉,向用户恳求告诉权限
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { [weak self] (granted, _) in
print("Perission granted: (granted)");
guard granted else { return }
// 1 创立一个新的告诉动作,标题为 "View" 按钮,当被触发时就会在前台翻开运用程序。
// 该动作有一个仅有标识符,iOS 用它来区分同一个告诉上的其他动作。
let viewAction = UNNotificationAction(identifier: Identifiers.viewAction,
title: "View",
options: [.foreground])
// 2 界说新闻类别,它将包括动作按钮。这也有一个共同的标识符,您的有用载荷将需求包括该标识符,以指定推送告诉归于该类别。
let newCategory = UNNotificationCategory(identifier: Identifiers.newsCategory,
actions: [viewAction],
intentIdentifiers: [],
options: [])
// 3 经过调用 setNotificationCategories 来注册新的可操作告诉。
UNUserNotificationCenter.current().setNotificationCategories([newCategory])
self?.getNotificationSettings()
}
}
在这儿,逐渐分化:
- 创立一个新的告诉动作,标题为 “View” 按钮,当被触发时就会在前台翻开运用程序。该动作有一个仅有标识符,iOS 用它来区分同一个告诉上的其他动作。
- 界说新闻类别,它将包括动作按钮。这也有一个共同的标识符,您的有用载荷将需求包括该标识符,以指定推送告诉归于该类别。
- 经过调用
setNotificationCategories
来注册新的可操作告诉。
构建并运转运用程序以注册新的告诉设置。
后台运用程序,然后经过 xcrun simctl
指令行发送以下有用载荷:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com",
"category": "NEWS_CATEGORY"
}
}
当告诉出现时,将其下拉以显现并查看操作:
很好! 点击 View 会发动 WenderCast,但它还没有做任何令人兴奋的作业。要让它显现新闻项目,你需求在代表中做更多的事件处理。
处理告诉动作
每当一个告诉动作被触发时,UNUserNotificationCenter
就会告诉其委托目标。回到 AppDelegate.swift 文件中,在文件底部增加以下类扩展:
// MARK: - UNUserNotificationCenterDelegate
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
// 1. 获取 userInfo 字典。
let userInfo = response.notification.request.content.userInfo;
// 2. 从 aps 字典中创立一个 NewsItem,然后导航到 News 标签页选项卡。
if let aps = userInfo["aps"] as? [String: AnyObject],
let newItem = NewsItem.makeNewsItem(aps) {
(window?.rootViewController as? UITabBarController)?.selectedIndex = 1
// 3. 查看 actionIdentifier。假如是 "View" 动作,而且链接是有用的 URL,那么它就会在一个 SFSafariViewController 中显现链接。
if response.actionIdentifier == Identifiers.viewAction,
let url = URL(string: newItem.link) {
let safari = SFSafariViewController(url: url)
window?.rootViewController?.present(safari, animated: true, completion: nil)
}
}
// 4. 调用体系传递给你的完结处理程序。
completionHandler()
}
}
这是当运用程序因自界说操作而翻开时,你得到的回调。它或许看起来有许多作业要做,但这儿没有太多的新东西:
- 获取
userInfo
字典。 - 从
aps
字典中创立一个NewsItem
,然后导航到News
标签页选项卡。 - 查看
actionIdentifier
。假如是 “View” 动作,而且链接是有用的 URL,那么它就会在一个SFSafariViewController
中显现链接。 - 调用体系传递给你的完结处理程序。
还有最终一点。你有必要在 UNUserNotificationCenter
上设置委托。在 application(_:didFinishLaunchingWithOptions:)
的顶部增加这一行:
UNUserNotificationCenter.current().delegate = self
构建并运转。再次封闭运用程序,然后发送另一个有用负载如下的新闻告诉:
{
"aps": {
"alert": "New Posts!",
"sound": "default",
"link_url": "https://raywenderlich.com",
"category": "NEWS_CATEGORY"
}
}
下拉告诉,然后点击 “View” 操作,你会看到 WenderCast 在发动后会当即出现一个 Safari View 控制器:
恭喜!你现已完结了一个可操作的告诉。发送更多的告诉,并测验以不同的方式翻开告诉,看看它是怎么体现的。
发送到真机设备
假如你不想向真机设备发送推送告诉,或者你还不需求静默推送告诉,你能够越过本节,转到 Where to Go From Here? ?
可是,假如你想了解怎么将推送告诉发送到真机设备并想要测验静默推送,那么你需求做一些额外的设置。下载 PushNotifications 开源东西。你将运用该东西向真机设备发送告诉。要装置它,请依照 How to install 中的说明进行装置。要特别留意怎么翻开运用程序,由于你有必要改变一些设置才干运转这个实用程序。
前往苹果开发者中心并登录。
发送推送告诉需求一个认证密钥(Authentication Key)。在会员中心,挑选 Certificates, Identifiers & Profiles,然后在左边窗格中找到 Keys。在 Keys 标题上有一个 “+” 按钮。点击它来创立一个新的密钥。
给密钥设置称号,比如 “Push Notification Key”。在 Key Services 下,勾选 Apple Push Notifications service (APNs)。
点击 Continue,然后在下一个屏幕上注册,以创立你的新密钥。点击 Download。下载的文件会有一个相似 AuthKey_4SVKWF966R.p8 的姓名。留意这个文件–你需求用它来发送告诉。文件名中的 4SVKWF966R 部分是 Key ID。你也需求这个。
最终一点你需求的是你的 Team ID。导航到苹果开发者中心的 Membership Details 页面找到它。
您成功了!有了新密钥,您现在能够发送您的第一个推送告诉了,您只需求再做一件事。
在您的真机设备上运转运用程序,并从 Xcode 调试器控制台仿制设备令牌(Device Token),等会需求将其仿制张贴到 PushNotification 东西中。
发动 PushNotifications 并履行以下进程:
- 在 Authentication 选项中,挑选 TOKEN。
- 点击 SELECT P8 按钮,在 Mac 文件中找到并挑选之前下载的
.p8
文件。 - 在相关字段中输入您的 Key ID 和 Team ID。
- 在 Body 中,输入你的运用程序的 Bundle ID 和你的 Device Token。
- 将 body 内容更改为如下:
{
"aps": {
"alert": "Breaking News!",
"sound": "default",
"link_url": "https://raywenderlich.com"
}
}
点击 PushNotifications 东西右侧的 Send 按钮经过 APNs 发送推送告诉。
你应该能收到推送告诉:
处理常见问题
这儿有几个你或许遇到的问题。
- 部分推送告诉发送成功了,但不是全部:假如你一起发送许多推送告诉,但你只收到了几个,不要惧怕!这便是这样规划的。APNs 为每个设备保护一个 QoS(服务质量)行列。这个行列的大小是1,所以假如你发送多个告诉,最终一个告诉会被覆盖。
- 连接到推送告诉服务(Push Notification Service)的问题。一种或许是防火墙封闭了 APNs 运用的端口。保证你解除了这些端口的封闭。
运用静默告诉
静音推送告诉能够静默唤醒你的运用,在后台履行一些使命。WenderCast 能够运用这个功用来悄然改写播客列表。
假如有一个合适的服务器组件,这能够是十分高效的。你的运用程序将不需求不断地轮询数据。每当有新数据时,你能够向它发送一个无声的推送告诉。
要开端,再次挑选 WenderCast 项目 target。现在点击 Signing & Capabilities 选项卡,增加 Background Modes capability。然后勾选其间的 Remote notifications 选项:
现在,当您的运用程序收到这些推送告诉时,它将在后台唤醒。
在 AppDelegate.swift 文件中,找到application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
。将对 NewsItem.makeNewsItem()
的调用替换为以下内容:
// 当运用收到推送告诉时,处理收到的推送告诉内容
// 默许状况下,假如运用收到推送告诉时处于前台状况,则会丢掉告诉内容
// 这儿能够截获推送内容,并更新运用页面
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let aps = userInfo["aps"] as? [String: AnyObject] else {
completionHandler(.failed)
return
}
// 1. 查看 `content-available` 值是否为 1,假如是,这是一个静默告诉标志。
if aps["content-available"] as? Int == 1 {
let podcastStore = PodcastStore.sharedStore
// 2. 改写播客列表,这是一个异步网络调用。
podcastStore.refreshItems { (didLoadNewItems ) in
// 3.当改写完结后,调用完结处理程序,让体系知道运用程序是否加载了任何新数据。
completionHandler(didLoadNewItems ? .newData : .noData)
}
} else {
// 4. 假如不是静默告诉,那么它便是一个新闻项目,所以要创立一个新闻项目。
NewsItem.makeNewsItem(aps)
completionHandler(.newData)
}
}
查看以上代码:
- 你查看
content-available
值是否为 1,假如是,这是一个静默告诉标志。 - 你改写播客列表,这是一个异步网络调用。
- 当改写完结后,调用完结处理程序,让体系知道运用程序是否加载了任何新数据。
- 假如不是静默告诉,那么它便是一个新闻项目,所以要创立一个新闻项目。 必定要用诚笃的结果来调用完结处理程序。体系会测量你的运用在后台运用的电池耗费和时间,假如需求的话,或许会对你的运用进行控制。
这便是它的全部内容。要测验它,请构建和运转,将运用切换到前台并经过 PushNotifications 实用程序推送以下有用载荷:
{
"aps": {
"content-available": 1
}
}
假如一切顺利,应该不会产生任何作业,除非刚刚有新的播客被增加到长途数据库中。为了确认代码按预期运转,在application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
中设置一个断点,并在告诉发送后越过它(step through it)。
何去何从?
恭喜你! 您现已完结了本教程,并使 WenderCast 成为一个具有推送告诉功用的全功用运用程序!
您能够运用本教程顶部或底部的 Download Materials 按钮下载完结的项目。
想深化了解推送告诉的一切功用,如构建自界说用户界面和发送紧迫推送?咱们的 Push Notifications by Tutorials 一书将教你推送告诉的高级功用。
另一个资源是 iOS 推送告诉教程:Rich Push Notification。
虽然推送告诉是现代运用的重要组成部分,但假如你的告诉过度,用户拒肯定你的运用进行权限也是很常见的。可是,经过交心的规划,推送告诉能够让你的用户一次又一次地回到你的运用中来!
希望你喜欢这个推送告诉教程。假如你有任何问题,欢迎在下面的讨论区留言。