原文:Push Notifications Tutorial: Getting Started

iOS 开发者喜欢幻想人们一直在运用他们的运用。可是,当然,用户也会不得不封闭运用并处理其他事务。究竟衣服不会自己叠,你知道的! 令人高兴的是,推送告诉答应开发者向用户发送音讯,即运用户当时没有在运用运用!在本教程中,您将学习怎么:

  • 装备您的运用程序以接纳推送告诉;
  • 将其显现给您的用户或履行其他使命。

开端

什么是推送告诉?它们是经过 Apple 推送告诉服务 (APNs) 发送给运用程序的音讯,即便运用程序没有运转或手机处于睡觉状况。那么,你能够运用推送告诉做什么?

  • 显现一条简略的音讯,称为 “Alert”,以引起人们对运用程序中新内容的重视。
  • 播映告诉声响。
  • 在运用程序的图标上设置一个角标数字,让用户知道运用中有新的内容。
  • 让用户能够在不翻开运用的状况下进行操作。
  • 显现一个媒体附件。
  • 发送静默推送告诉,让运用程序在后台履行使命。
  • 将告诉分组到线程中。
  • 修改或删去已发送的告诉。
  • 在显现告诉前运转代码以更改告诉。
  • 为你的告诉显现一个自界说的可交互式 UI。
  • 或许还有更多。

本教程涵盖了许多方面,以帮助您开端在您的运用程序中创立推送告诉。要完本钱教程,您需求以下条件:

  • Xcode 11.4 或更高版本。前期版本的 Xcode 不支持运用模仿器推送告诉。
  • 一个 Apple Developer Program 账号,以便能够开启推送告诉功用并编译运用程序。

注:在后面的教程中,您将学习 Sending to a Real Device 向实在设备发送推送告诉。

要发送和接纳推送告诉,您有必要履行三项主要使命:

  1. 装备您的运用程序并将其注册到 APNs。
  2. 经过 APNs 从服务器向特定设备发送推送告诉。你将用 Xcode 来模仿。
  3. 在运用程序中运用回调来接纳和处理推送告诉。

发送推送告诉音讯是你的运用程序的服务端的使命。许多运用程序运用第三方服务来发送推送告诉。其他运用程序则运用自界说处理计划或流行的库(如 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)");
    }
}

这段代码的作用:

  1. UNUserNotificationCenter 处理运用程序中一切与告诉相关的活动,包括推送告诉。
  2. 你调用 requestAuthorization(options:completionHandler:) 向用户恳求授权以显现告诉。传递的选项表明您希望您的运用程序要运用的告诉类型–这儿您恳求的是警报、声响和角标。
  3. 完结处理程序会收到一个 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中,挑选 WindowsDevices 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 包括字段 alertsoundlink_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
}

这便是你正在做的作业:

  1. 查看 UIApplication.LaunchOptionsKey.remoteNotification 的值是否存在于 launchOptions 中。假如存在,那么你的运用是从告诉中发动的。这儿面就会包括你发送的推送告诉的有用载荷。
  2. 由于 aps 字典存在,用它创立一个 NewsItem
  3. 将标签控制器的 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()
    }
}

在这儿,逐渐分化:

  1. 创立一个新的告诉动作,标题为 “View” 按钮,当被触发时就会在前台翻开运用程序。该动作有一个仅有标识符,iOS 用它来区分同一个告诉上的其他动作。
  2. 界说新闻类别,它将包括动作按钮。这也有一个共同的标识符,您的有用载荷将需求包括该标识符,以指定推送告诉归于该类别。
  3. 经过调用 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()
    }
}

这是当运用程序因自界说操作而翻开时,你得到的回调。它或许看起来有许多作业要做,但这儿没有太多的新东西:

  1. 获取 userInfo 字典。
  2. aps 字典中创立一个 NewsItem,然后导航到 News 标签页选项卡。
  3. 查看 actionIdentifier。假如是 “View” 动作,而且链接是有用的 URL,那么它就会在一个 SFSafariViewController 中显现链接。
  4. 调用体系传递给你的完结处理程序。

还有最终一点。你有必要在 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 并履行以下进程:

  1. Authentication 选项中,挑选 TOKEN
  2. 点击 SELECT P8 按钮,在 Mac 文件中找到并挑选之前下载的 .p8 文件。
  3. 在相关字段中输入您的 Key IDTeam ID
  4. Body 中,输入你的运用程序的 Bundle ID 和你的 Device Token。
  5. 将 body 内容更改为如下:
{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }
}

点击 PushNotifications 东西右侧的 Send 按钮经过 APNs 发送推送告诉。

推送告诉入门教程

你应该能收到推送告诉:

推送告诉入门教程

处理常见问题

这儿有几个你或许遇到的问题。

  1. 部分推送告诉发送成功了,但不是全部:假如你一起发送许多推送告诉,但你只收到了几个,不要惧怕!这便是这样规划的。APNs 为每个设备保护一个 QoS(服务质量)行列。这个行列的大小是1,所以假如你发送多个告诉,最终一个告诉会被覆盖。
  2. 连接到推送告诉服务(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)
    }
}

查看以上代码:

  1. 你查看 content-available 值是否为 1,假如是,这是一个静默告诉标志。
  2. 你改写播客列表,这是一个异步网络调用。
  3. 当改写完结后,调用完结处理程序,让体系知道运用程序是否加载了任何新数据。
  4. 假如不是静默告诉,那么它便是一个新闻项目,所以要创立一个新闻项目。 必定要用诚笃的结果来调用完结处理程序。体系会测量你的运用在后台运用的电池耗费和时间,假如需求的话,或许会对你的运用进行控制。

这便是它的全部内容。要测验它,请构建和运转,将运用切换到前台并经过 PushNotifications 实用程序推送以下有用载荷:

{
  "aps": {
    "content-available": 1
  }
}

假如一切顺利,应该不会产生任何作业,除非刚刚有新的播客被增加到长途数据库中。为了确认代码按预期运转,在application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 中设置一个断点,并在告诉发送后越过它(step through it)。

何去何从?

恭喜你! 您现已完结了本教程,并使 WenderCast 成为一个具有推送告诉功用的全功用运用程序!

您能够运用本教程顶部或底部的 Download Materials 按钮下载完结的项目。

想深化了解推送告诉的一切功用,如构建自界说用户界面和发送紧迫推送?咱们的 Push Notifications by Tutorials 一书将教你推送告诉的高级功用。

另一个资源是 iOS 推送告诉教程:Rich Push Notification

虽然推送告诉是现代运用的重要组成部分,但假如你的告诉过度,用户拒肯定你的运用进行权限也是很常见的。可是,经过交心的规划,推送告诉能够让你的用户一次又一次地回到你的运用中来!

推送告诉入门教程

希望你喜欢这个推送告诉教程。假如你有任何问题,欢迎在下面的讨论区留言。