系统推送的集成(十九) —— APNs配置接收和处理的简单入门(一)

版本记录

版本号 时间
V1.0 2020.10.14 星期三

前言

我们做APP很多时候都需要推送功能,以直播为例,如果你关注的主播开播了,那么就需要向关注这个主播的人发送开播通知,提醒用户去看播,这个只是一个小的方面,具体应用根据公司的业务逻辑而定。前面已经花了很多篇幅介绍了极光推送,其实极光推送无非就是将我们客户端和服务端做的很多东西封装了一下,节省了我们很多处理逻辑和流程,这一篇开始,我们就利用系统的原生推送类结合工程实践说一下系统推送的集成,希望我的讲解能让大家很清楚的理解它。感兴趣的可以看上面几篇。
1. 系统推送的集成(一) —— 基本集成流程(一)
2. 系统推送的集成(二) —— 推送遇到的几个坑之BadDeviceToken问题(一)
3. 系统推送的集成(三) —— 本地和远程通知编程指南之你的App的通知 - 本地和远程通知概览(一)
4. 系统推送的集成(四) —— 本地和远程通知编程指南之你的App的通知 - 管理您的应用程序的通知支持(二)
5. 系统推送的集成(五) —— 本地和远程通知编程指南之你的App的通知 - 调度和处理本地通知(三)
6. 系统推送的集成(六) —— 本地和远程通知编程指南之你的App的通知 - 配置远程通知支持(四)
7. 系统推送的集成(七) —— 本地和远程通知编程指南之你的App的通知 - 修改和显示通知(五)
8. 系统推送的集成(八) —— 本地和远程通知编程指南之苹果推送通知服务APNs - APNs概览(一)
9. 系统推送的集成(九) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 创建远程通知Payload(二)
10. 系统推送的集成(十) —— 本地和远程通知编程指南之苹果推送通知服务APNs - 与APNs通信(三)
11. 系统推送的集成(十一) —— 本地和远程通知编程指南之苹果推送通知服务APNs - Payload Key参考(四)
12. 系统推送的集成(十二) —— 本地和远程通知编程指南之Legacy信息 - 二进制Provider API(一)
13. 系统推送的集成(十三) —— 本地和远程通知编程指南之Legacy信息 - Legacy通知格式(二)
14. 系统推送的集成(十四) —— 发送和处理推送通知流程详解(一)
15. 系统推送的集成(十五) —— 发送和处理推送通知流程详解(二)
16. 系统推送的集成(十六) —— 自定义远程通知(一)
17. 系统推送的集成(十七) —— APNs从工程配置到自定义通知UI全流程解析(一)
18. 系统推送的集成(十八) —— APNs从工程配置到自定义通知UI全流程解析(二)

开始

首先看下主要内容:

推送通知使开发人员可以联系用户,即使用户没有在使用应用程序! 在本教程中,您将学习如何配置应用程序以接收推送通知,并将其显示给用户或执行其他任务。内容来自翻译

下面看下写作环境

Swift 5, iOS 14, Xcode 12

下面就是正文了。

iOS开发人员喜欢想象人们不断使用他们的超棒应用程序。但是,当然,用户有时必须关闭应用程序并执行其他活动。令人高兴的是,即使用户没有积极使用应用程序,推送通知也可以使开发人员联系用户并执行小任务!在本教程中,您将学习如何:

  • 配置您的应用以接收推送通知。
  • 向用户显示它们或执行其他任务。

什么是推送通知(push notification)?它们是即使您的应用未运行或手机处于睡眠状态,也会通过Apple Push Notification Service(APN)发送到您的应用的消息。您可以将推送通知用于什么?

  • 显示一条短消息,称为alert,以吸引您注意应用程序中的新内容。
  • 播放通知声音。
  • 在应用程序的图标上设置badge number,以使用户知道有新事物。
  • 提供用户无需打开应用即可执行的操作。
  • 显示媒体附件(media attachment)
  • 保持沉默,允许应用程序在后台执行任务。
  • 将通知分组为线程(Group notifications into threads)
  • 编辑或删除传递的通知。
  • 运行代码以更改您的通知,然后再显示。
  • 显示您的通知的自定义交互式UI。
  • 可能还有更多。

本教程涵盖了许多这些用法,以帮助您开始在应用程序中创建推送通知。要完成本教程,您需要具备以下条件:

  • Xcode 11.4或更高版本。早期版本的Xcode不支持使用模拟器的推送通知。
  • Apple开发人员计划成员身份,可以使用Push Notifications entitlement来编译应用程序。

注意:在本教程的后面,您将在Sending to a Real Device中学到如何将推送通知发送到真实设备。

要发送和接收推送通知,您必须执行三个主要任务:

  • 1) 配置您的应用程序并将其注册到APNs
  • 2) 通过APNs将推送通知从服务器发送到特定设备。您将使用Xcode进行模拟。
  • 3) 在应用程序中使用回调来接收和处理推送通知。

发送推送通知是您应用的服务器组件的责任。许多应用程序使用第三方来发送推送通知。其他人则使用自定义解决方案或流行的库(例如Houston)。在本教程中,您只会接触发送推送消息。

打开WenderCast入门项目。 WenderCastraywenderlich.com播客和突发新闻的每个人都喜欢的资源。

在启动文件夹中,打开WenderCast.xcodeproj。在项目导航器中选择WenderCast,然后选择WenderCast target。在General & Capabilities选项卡中,选择您的开发团队。在模拟器中构建并运行。

WenderCast显示raywenderlich.com播客列表,并允许用户播放。 但是,当有新播客可用且News标签为空时,它不会通知用户! 您将很快借助推送通知来解决这些问题。


Sending and Receiving Push Notifications

1. Configuring the App

安全性对于推送通知非常重要。 您不希望其他人通过您的应用向用户发送推送通知。 您需要执行多项任务,以将您的应用配置为安全地接收推送通知。

2. Enabling the Push Notification Service

首先,您必须更改bundle identifier。 在Xcode中,在“项目”导航器中突出显示WenderCast,然后选择WenderCast target。 选择General,然后将Bundle Identifier更改为唯一的名称,以便Apple的推送通知服务器可以将推送定向到此应用。

接下来,您需要在开发人员帐户中创建一个App ID,然后启用推送通知权利。 Xcode有一个简单的方法来执行此操作:在仍选择WenderCast target的情况下,单击Signing & Capabilities选项卡,然后单击+ Capability按钮。 在过滤器字段中键入push,然后按Enter

添加push notifications entitlement后,您的项目应如下所示:

注意:如果发生任何问题,请访问Apple Developer Center.。 您可能需要同意Apple新开发人员证书许可,然后重试。

然后将创建应用ID,然后向其中添加推送通知权利。 您可以登录Apple开发人员中心进行验证:

这就是您现在需要配置的全部。 您已准备好开始增强应用程序。

3. Asking for User Notifications Permission

您需要执行两个步骤来注册推送通知。 首先,您必须获得用户的权限才能显示通知。 然后,您可以注册设备以接收远程(推送)通知。 如果一切顺利,系统将为您提供device token,您可以将其视为该设备的地址

WenderCast中,您将在应用启动后立即注册推送通知。 首先要求用户权限。

打开AppDelegate.swift并将以下内容添加到文件顶部:

import UserNotifications

然后,将以下方法添加到AppDelegate的末尾:

func registerForPushNotifications() {
  //1
  UNUserNotificationCenter.current() 
    //2
    .requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in
      //3
      print("Permission granted: \(granted)")
    }
}

该代码的作用:

  • 1) UNUserNotificationCenter处理应用程序中所有与通知有关的活动,包括推送通知。
  • 2) 您调用requestAuthorization(options:completionHandler :)来(您猜对了)请求授权以显示通知。传递的options表示您希望应用程序使用的通知类型-在这里您需要alert, sound and badge
  • 3) 完成处理程序将收到一个Bool,该Bool指示授权是否成功。在这种情况下,您只需打印结果。

注意:传递给requestAuthorization(options:completionHandler :)的选项可以包括UNAuthorizationOptions的任意组合:

.badge:在应用程序图标的一角显示一个数字。
.sound:播放声音。
.alert:显示文本通知。
.carPlay:在CarPlay中显示通知。
.provisional:发布不打断的通知。如果您仅使用此选项,则不会收到用户的许可请求,但是您的通知只会在通知中心静默显示。
.providesAppNotificationSettings:指示应用程序具有自己的通知设置用户界面。
.criticalAlert:忽略静音开关,请勿打扰。您需要Apple的特殊授权才能使用此选项,因为它仅适用于非常特殊的用例。

将以下内容添加到application(_:didFinishLaunchingWithOptions:)的结尾附近,就在return之前:

registerForPushNotifications()

在此处调用registerForPushNotifications()可确保该应用在每次启动时都会尝试注册推送通知。

构建并运行。 应用启动时,您应该会收到一个提示,询问您是否需要向您发送通知。

点按Allow,该应用程序现在可以显示通知。很好! 但是,如果用户拒绝该权限怎么办? 在AppDelegate中添加此方法:

func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { settings in
    print("Notification settings: \(settings)")
  }
}

首先,您指定了所需的设置。 此方法返回用户已授予的设置。 目前,您正在打印它们,但是不久之后您将再次回来,以执行更多操作。

registerForPushNotifications()中,将对requestAuthorization(options:completionHandler :)的调用替换为以下内容:

UNUserNotificationCenter.current()
  .requestAuthorization(
    options: [.alert, .sound, .badge]) { [weak self] granted, _ in
    print("Permission granted: \(granted)")
    guard granted else { return }
    self?.getNotificationSettings()
  }

您已在完成处理程序中添加了对getNotificationSettings()的调用。 这很重要,因为用户可以随时进入设置并更改其通知权限。 在未获得许可的情况下,guard避免这时的调用。

4. Registering With APNs

获得权限后,您就可以注册远程通知了!

getNotificationSettings()中,在闭包内部的print下方添加以下内容:

guard settings.authorizationStatus == .authorized else { return }
DispatchQueue.main.async {
  UIApplication.shared.registerForRemoteNotifications()
}

在这里,您验证authorizationStatus.authorized:用户已授予通知权限。 如果是这样,您可以调用UIApplication.shared.registerForRemoteNotifications()以开始使用Apple Push Notification服务进行注册。 您需要在主线程上调用它,否则会收到运行时警告。

将以下内容添加到AppDelegate的末尾:

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转换为字符串。 deviceToken是此过程的结果。 它由APNs提供,可在此特定设备上唯一标识此应用。

发送推送通知时,服务器将deviceToken用作“地址”以传递到正确的设备。 现在,在您的应用程序中,您可以将此deviceToken发送到服务器,以保存并稍后用于发送通知。

现在添加以下内容:

func application(
  _ application: UIApplication,
  didFailToRegisterForRemoteNotificationsWithError error: Error
) {
  print("Failed to register: \(error)")
}

如果registerForRemoteNotifications()失败,则iOS会调用此方法。 您现在只是打印error

就这些! 构建并运行。 由于您使用的是模拟器,因此会看到Failed to register错误。 您现在可以忽略它。 稍后,当您在真实设备上运行时,您应该在控制台输出中收到一个token。 这是一个例子:

注意:注册失败的原因有多种。 通常是因为App ID未正确配置。 该错误消息通常可以为您提供错误提示。


Sending a Simulated Push Notification

使用文本编辑器创建一个名为first.apn的文件,该文件将传递给Xcode的simctl实用程序。 粘贴以下JSON文本并保存文件。

{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }
}

下一部分将说明此JSON的结构。

再次在模拟器上构建并运行该应用程序,然后使该应用程序后台运行或锁定设备。 该应用程序在前台时尚无法处理推送通知。

要使用simctl,您需要知道运行应用程序的模拟器的设备标识符。要获取标识符,请在Xcode中选择Windows ▸ Devices and Simulators,然后选择顶部的Simulators选项卡,然后选择您在左侧列表中使用的模拟器。 使用鼠标复制标识符。 您可能需要扩大对话框才能完全看到它。

打开终端Terminal应用程序,然后键入以下命令:xcrun simctl push device_identifier bundle_identifier first.apn。 将device_identifier替换为您从Xcode复制的设备标识符,并将bundle_identifier替换为应用程序的bundle identifier,即您首次设置项目时使用的bundle identifier。 这是一个例子:

运行命令,您将看到推送通知出现在模拟器上!

点击通知以启动应用程序。

那不是很酷吗?

1. Looking at a Basic Push Notification

在继续处理推送通知之前,请查看发送的通知的正文:

{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }
}

payload是一个JSON字典,其中包含至少一项aps,它也是一个字典。在此示例中,aps包含alert, sound, and link_url字段。当设备收到此推送通知时,将显示一个带有Breaking News!文本的alert视图。并播放标准声音效果。

link_url实际上是一个自定义字段。您可以像这样将自定义字段添加到payload中,它们将被传递到您的应用程序中。由于您尚未在应用程序内部处理它,因此此键/值对目前不执行任何操作。

更正:一位聪明的读者指出,Apple’s documentation指出自定义内容(例如link_url)应位于aps词典条目的同级别,而不是其内部。如果将其放在内部,它仍然可以使用,但是我们始终建议您遵循Apple的文档,并会在本教程的下一次更新中对此进行更正。

您可以将8个内置密钥添加到aps词典中(有关更多信息,请参见官方的 Payload Key Reference):

  • alert:这可以是字符串(如上例所示)或字典。作为字典,它可以本地化文本或更改通知的其他方面。
  • badge:此数字将显示在应用程序图标的一角。您可以通过将其设置为0来删除徽章。
  • sound:位于应用中的自定义通知声音文件的名称。这些时间必须少于30秒。
  • thread-id:使用此键可以将通知分组。
  • category:这定义了通知的类别,用于显示对通知的自定义操作。您将很快对此进行探索。
  • content-available:通过将此键设置为1,推送通知将变为静默。您将在下面的Silent Push Notifications部分中了解此内容。
  • mutable-content:通过将此键设置为1,您的应用可以在显示通知之前对其进行修改。
  • target-content-id:这是提出的窗口的标识符。

在这些之外,只要payload不超过4,096字节,就可以添加任意数量的自定义数据。

尝试了这些选项并将推送通知发送到模拟器后,您将获得足够的乐趣,然后继续下一部分!


Handling Push Notifications

在本节中,您将学习如何在应用收到通知以及用户点击通知时执行操作。

1. Understanding What Happens When You Receive a Push Notification

当您的应用收到推送通知时,iOS会在UIApplicationDelegate中调用一个方法。

您需要根据收到通知时应用所处的状态来不同地处理通知:

  • 如果您的应用程序未运行,并且用户通过点击推送通知来启动它,则iOS会将通知通过应用程序的launchOptions(_:didFinishLaunchingWithOptions :)传递给您的应用程序。
  • 如果您的应用程序在前台或后台运行,则系统通过调用application(_:didReceiveRemoteNotification:fetchCompletionHandler :)通知您的应用程序。当用户通过点击推送通知打开应用程序时,iOS可能会再次调用此方法,因此您可以更新UI并显示相关信息。

在第一种情况下,WenderCast将创建新闻项(news item)并直接打开News选项卡。在AppDelegate.swift中,将以下代码添加到application(_:didFinishLaunchingWithOptions :)的末尾,就在return语句之前:

// Check if launched from notification
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
}

这是您正在做的:

  • 1) 检查launchOptions中是否存在UIApplication.LaunchOptionsKey.remoteNotification的值。 如果存在的话,则您的应用是从通知启动的。 这将包含您发送的推送通知payload
  • 2) 由于aps字典存在,因此用它创建一个NewsItem
  • 3) 将 tab controller的选定选项卡更改为新闻部分。

要对此进行测试,您需要编辑WenderCastscheme。 首先,构建并运行以在模拟器上安装最新代码。 然后,单击WenderCast scheme并选择Edit Scheme…

从边栏中选择Run,然后在Info选项卡中选择Wait for executable to be launched

此选项将使调试器在安装以附加到应用程序之后,等待应用程序首次启动。

构建并运行。 安装完成后,请像以前一样使用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

构建并运行。 使应用程序在前台和News选项卡上运行。 发送另一个新闻推送通知,并查看它在Feed中的显示情况:

就这些!您的应用现在可以神奇地接收突发新闻。

注意:不能保证推送通知会到达。对于WenderCast来说,这是可以的,因为拥有完整的新闻列表对该应用程序而言并不重要。但是,通常,您不应将推送通知用作传递内容的唯一方法。相反,推送通知应表明有新内容可用,并允许应用从源(例如,从REST API)下载内容。


Working With Actionable Notifications

可操作的通知使您可以将自定义按钮添加到通知本身。您可能已经在电子邮件通知或Tweet上注意到了这一点,使您当场“回复”或“收藏”。

当您使用categories注册通知时,您的应用可以定义可操作的通知。每种通知类别可以具有一些预设的自定义操作。

注册后,您的服务器可以设置推送通知的类别。收到相应的操作后,用户将可以使用它们。

对于WenderCast,您将使用名为View的自定义操作定义News类别。如果用户愿意,此操作将允许用户在应用程序中查看新闻报道。

registerForPushNotifications()中,将以下内容插入到guard的下方以及对getNotificationSettings()的调用上方:

// 1
let viewAction = UNNotificationAction(
  identifier: Identifiers.viewAction,
  title: "View",
  options: [.foreground])

// 2
let newsCategory = UNNotificationCategory(
  identifier: Identifiers.newsCategory,
  actions: [viewAction],
  intentIdentifiers: [],
  options: [])

// 3
UNUserNotificationCenter.current().setNotificationCategories([newsCategory])

逐步进行以下操作:

  • 1) 创建一个新的通知操作,按钮上的标题为View,该操作将在触发时在前台打开应用程序。 该动作具有唯一的标识符,iOS使用该标识符来区分同一通知的其他动作。
  • 2) 定义news类别,其中将包含查看View操作。 这也有一个唯一标识符,您的payload将需要包含该标识符以指定推送通知属于此类别。
  • 3) 通过调用setNotificationCategories注册新的可执行通知。

构建并运行该应用程序以注册新的通知设置。

后台应用程序,然后通过xcrun simctl实用程序发送以下payload

{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com",
    "category": "NEWS_CATEGORY"
  }
}

出现通知时,将其下拉以显示View操作:

真好! 点击View将启动WenderCast,但目前还没有任何令人兴奋的事情。 若要使其显示新闻项,您需要在委托中执行更多事件处理。

1. Handling Notification Actions

每当触发通知操作时,UNUserNotificationCenter就会通知其委托人。 返回AppDelegate.swift,在文件底部添加以下类扩展名:

// MARK: - UNUserNotificationCenterDelegate

extension AppDelegate: UNUserNotificationCenterDelegate {
  func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse,
    withCompletionHandler completionHandler: @escaping () -> Void
  ) {
    // 1
    let userInfo = response.notification.request.content.userInfo
    
    // 2
    if 
      let aps = userInfo["aps"] as? [String: AnyObject],
      let newsItem = NewsItem.makeNewsItem(aps) {
      (window?.rootViewController as? UITabBarController)?.selectedIndex = 1
      
      // 3
      if response.actionIdentifier == Identifiers.viewAction,
        let url = URL(string: newsItem.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

构建并运行。 再次关闭应用程序,然后使用以下负载payload发送另一个新闻通知:

{
  "aps": {
    "alert": "New Posts!",
    "sound": "default",
    "link_url": "https://raywenderlich.com",
    "category": "NEWS_CATEGORY"
  }
}

下拉通知并点击View操作,您将看到WenderCast在启动后立即显示Safari View控制器:

恭喜,您已经实现了自定义行为的通知!再发送一些,然后尝试以其他方式打开通知以查看其行为。


Sending to a Real Device

如果您不希望将推送通知发送到真实设备,或者您还不需要静默推送通知,则可以跳过本节。

但是,如果您想了解如何将推送通知发送到真实设备并尝试静默推送,则需要进行一些其他设置。下载PushNotifications实用程序。您将使用此实用程序应用将通知发送到真实设备。要安装它,请按照How to install下的说明进行操作。请特别注意 how to open the app,因为您必须更改某些设置才能运行此实用程序。

前往Apple Developer Member Center并登录。

发送推送通知需要Authentication Key。在成员中心中,选择Certificates, Identifiers & Profiles,然后在左窗格中找到KeysKeys标题右侧是一个+按钮。单击它以创建一个新密钥。

为密钥命名,例如Push Notification Key。在Key Services下,选择Apple Push Notifications service (APNs)

单击Continue,然后在下一个屏幕上Register以创建新密钥。 点击Download。 下载的文件将具有类似于AuthKey_4SVKWF966R.p8的名称。 跟踪此文件-您将需要它来发送通知! 文件名的4SVKWF966R部分是Key ID。 您还将需要此。

您需要的最后一块是您的Team ID。 导航到会员中心的Membership Details页面以找到它。

你做到了! 使用新密钥,您现在就可以发送您的第一个推送通知! 您只需要再做一件事。

在实际设备上运行该应用程序,然后从调试器控制台复制设备令牌并准备就绪。

启动PushNotifications并完成以下步骤:

  • 1) 在Authentication下,选择Token
  • 2) 单击Select P8按钮,然后从上一节中选择.p8文件。
  • 3) 在相关字段中输入您的Key IDTeam ID
  • 4) 在Body下,输入您应用的Bundle IDdevice token
  • 5) 更改请求体,如下所示:
{
  "aps": {
    "alert": "Breaking News!",
    "sound": "default",
    "link_url": "https://raywenderlich.com"
  }
}

点击PushNotificationsSend的按钮

您应该会收到推送通知:

1. Troubleshooting Common Issues

您可能会遇到以下几个问题:

  • Some notifications arrive, but not all - 某些通知会到达,但不是全部:如果您同时发送许多推送通知,但只收到少量通知,请不要担心!那是设计使然。 APNs为每个设备维护一个QoS(服务质量)队列。该队列的大小为1,因此,如果您发送多个通知,则最后一个通知将被覆盖。
  • Problem connecting to Push Notification Service - 连接到推送通知服务时出现问题:一种可能是防火墙阻止了APNs使用的端口。确保取消阻止这些端口。

Using Silent Push Notifications

静默的推送通知可以静默唤醒您的应用程序,以在后台执行某些任务。 WenderCast可以使用此功能安静地刷新播客列表。

使用适当的服务器组件,可以非常高效。您的应用无需持续轮询数据。只要有新数据可用,您就可以向它发送静默推送通知。

首先,再次选择WenderCast target。现在单击Signing & Capabilities选项卡,并添加Background Modes功能。然后检查Remote notifications选项:

现在,当您的应用收到这些推送通知之一时,它将在后台唤醒。

AppDelegate.swift中,找到application(_:didReceiveRemoteNotification:fetchCompletionHandler :)。 用以下命令替换对NewsItem.makeNewsItem()的调用:

// 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实用程序推送以下payload

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

如果一切顺利,除非没有将新的播客添加到远程数据库,否则什么也不会发生。 若要确认代码是否按预期运行,请在application(_:didReceiveRemoteNotification:fetchCompletionHandler :)中设置一个断点,并在发送通知后逐步执行。

有一个资源是Push Notifications Tutorial for iOS: Rich Push Notifications

虽然推送通知是现代应用程序的重要组成部分,但如果您过度使用通知,用户也会拒绝对您的应用程序的访问权限。 但是经过精心设计,推送通知可以使您的用户一次又一次地回到您的应用程序中!

This cat received a push notification that his dinner was ready!

后记

本篇主要讲述了APNs配置接收和处理的简单入门,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270