原文:Push Notifications Tutorial for iOS: Rich Push Notifications

假如你在曩昔十年中运用过移动设备,你很或许遇到过很多的推送告知。推送告知答应运用程序向用户广播警报–即使他们没有活跃运用设备。

虽然告知能够向用户出现有用的信息,但告知的真实力气来自于被称为 rich notifications(富文本告知)的概念。富文本告知答应您阻拦告知有效载荷,并让您有时刻以最适合用户需求的办法来装扮它们。这答应您显现自定义 UI,能够包括按钮操作,为用户供给快捷办法。

本教程假定你对推送告知有一定的了解。假如你需求刷基础知识,请查看推送告知入门教程。该教程将教你怎么发送和接纳推送告知,并在推送内容中增加操作。

本教程将进一步学习这些知识。你将学习怎么修正和增强传入的内容,怎么环绕你的推送内容创立自定义的 UI 等等!

开端

点击本教程顶部或底部的 Download Materials 按钮,下载初始化项目。

由于推送告知只在真机设备上作业,您需求用几个特点装备 Apple 开发者账户,以便贯穿本教程内容。Xcode 能够经过主动装备为你处理大部分的作业。

初始化项目

在 Xcode 中翻开发动项目。假如您还没有登录到您的开发团队,请进入偏好设置,挑选账户选项卡,然后运用+按钮登录。

iOS推送告知教程:Rich Push Notification

接下来,鄙人载文件中挑选 Wendercast 项目。保证 Wendercast target 被选中。在中间面板中,转到 Signing & Capabilities 选项卡,并选中 Automatically manage signing 以主动办理运用签名。

iOS推送告知教程:Rich Push Notification

设置以下内容:

  1. 从 Team 下拉菜单中挑选您的开发团队。
  2. Bundle Identifier 中,输入仅有的 Bundle ID
  3. App Groups 下,单击 “+”。留下组前缀,并输入上一步中运用的相同的 bundle ID。
  4. 保证 Push Notification 功用存在于 capabilities 列表中。

iOS推送告知教程:Rich Push Notification

假如您看到两个不同的 Signing (debug)Signing (release) 部分,请在两个部分运用相同的值装备 Automatically manage signingTeamBundle Identifier

最后,翻开 DiskCacheManager.swift。然后将 groupIdentifier 特点更新为你的新运用组ID。

let groupIdentifier = "[[group identifier here]]"

创立授权密钥

这一步,请登录 苹果开发者账户。点击 Account 选项卡,然后依照这些阐明操作:

  1. 在左侧面板中挑选 Certificates, ID, & Profiles
  2. Certificates, ID, & Profiles 页面中,挑选 Keys
  3. 点击 + 按钮。
  4. 填写密钥称号, 勾选 Apple Push Notifications Service (APNs) 然后点击 Continue
    iOS推送告知教程:Rich Push Notification
  5. 点击 Register 注册。
  6. 记下您的密钥 ID。你会在后边的过程中需求它。
  7. 点击 Download 下载将 .p8 文件保存到电脑磁盘中。
  8. 再记下你的 Team ID;它显现在页面的右角(在你的名字或公司称号下面)。

唷!这里有很多内容。现在你现已完结了开发者账户操作,是时分回到装备发动运用程序了。

这一步将让运用程序读取和写入同享的运用程序容器。当你增加扩展时,这是必要的,这样运用程序和扩展都能够拜访Core Data 存储。

哦,假如你想知道。是的,你将创立的不是一个而是两个扩展, 而运用程序将运用 Core Data。:]

运转 App

Wendercast 运用程序获取并解析 Ray Wenderlich 播客源。然后将成果显现在一个 UITableView 中。用户能够点击任何一集来翻开细节视图,并翻开流媒体播映该集。他们还能够收藏任何一集。

如前所述,该运用运用 Core Data 来完结会话之间的持久性。在 feed 刷新期间,该运用程序只插入新的剧集。

要开端,保证你的 iPhone 是选定的设备。然后构建并运转。你应该看到一个播客列表,并弹窗提示是否启用告知。点击答应。

iOS推送告知教程:Rich Push Notification

点击列表中的任何一集,你会看到详细内容。选定的播客会主动开端播映。

iOS推送告知教程:Rich Push Notification

太棒了!现在,你将发送一个测验推送告知。

翻开 Xcode 控制台。你应该看到设备令牌打印在日志中。

Permission granted: true
Notification settings:
  <UNNotificationSettings: 0x2808abaa0; authorizationStatus: Authorized,
   notificationCenterSetting: Enabled, soundSetting: Enabled,
   badgeSetting: Enabled, lockScreenSetting: Enabled,
   carPlaySetting: NotSupported, announcementSetting: NotSupported,
   criticalAlertSetting: NotSupported, alertSetting: Enabled,
   alertStyle: Banner,
   groupingSetting: Default providesAppNotificationSettings: No>
Device Token: [[device-token-here]]

保存这个值,由于你会需求它,嗯,现在就需求。

测验推送告知

在您测验推送告知之前,您需求能够发送这些告知。

发送推送告知需求你调用 Apple Push Notification Server (APNs) 的 REST API 接口。这绝对不是最简略的作业–尤其是当你必须手动完结时。

走运的是,还有另一种办法。只需求一个运用程序为你完结即可。:]

依照这些阐明进行操作。

  1. 下载和装置 PushNotifications 开源运用软件。
  2. 发动运用。

    留意:假如 macOS 抱怨无法发动运用,请在 Finder 中右键点击运用并挑选翻开。

  3. 挑选 iOS 标签页。
  4. 挑选 Authentication 中的 Token
  5. 点击 Select P8,然后挑选你保存到电脑磁盘中的 .p8 文件。
  6. Enter key id 输入框中输入 .p8 密钥 ID。你是鄙人载 p8 文件之前仿制的。
  7. Enter team id 输入框中输入你的 Team ID。
  8. Body 下输入你的运用程序 Bundle ID。
  9. 输入你在上一步中保存的 device token。
  10. Collapse id 栏留空。
  11. 让 payload 内容坚持原样。

当你完结以上过程后,它应该是这样的:

iOS推送告知教程:Rich Push Notification

将运用程序切换到设备后台,但要让设备解锁。在 PushNotifications 运用中点击 Send 按钮。你会收到一个推送告知以及一条成功信息。

iOS推送告知教程:Rich Push Notification

万岁!现在,你现已准备好了,总算能够深入研究代码了。

覆写推送内容

苹果现已完结了一种办法,在交付之前用服务扩展修正推送内容。服务扩展答应你阻拦从 APNs 传来的推送内容,修正它,然后将修正后的有效载荷传递给用户。

服务扩展位于 APNs 服务器和推送告知的终究内容之间:

iOS推送告知教程:Rich Push Notification

介绍 Service Extensions

服务扩展能够获得有限的履行时刻(30 秒),对经过推送传入的 payload 履行一些逻辑。你能够做的修正和增强推送有效载荷的作业有:

  1. 更新推送的标题,副标题或正文。
  2. 为推送增加一个媒体附件。

增加 Service Extensions

回到 Wendercast 项目,经过单击 FileNewTarget…. 创立一个新方针。

挑选 Notification Service Extension,然后单击 Next

iOS推送告知教程:Rich Push Notification

将扩展命名为 WendercastNotificationService。字段应该是这样的:

iOS推送告知教程:Rich Push Notification

称号输入完结后,点击 Finish 完结。假如弹窗提示,不要激活新方案。

就这样,你现已在项目中增加了一个告知服务扩展,你现已准备好阻拦一些推送告知了。:]

向 Extension 导入文件

你将从项目中包括的一些 helper 类开端,到你创立的新服务扩展。在 Network 目录下,你会发现两个文件:ImageDownloader.swiftNetworkError.swift

在文件查看器(File inspector)中,为 WendercastNotificationService 方针增加一个查看,这样它们就能够在服务扩展中运用。

iOS推送告知教程:Rich Push Notification

保存文件

WendercastNotificationService 组中,翻开 NotificationService.swift,在文件顶部导入 UIKit

import UIKit

NotificationService 的底部,增加这个快捷办法来保存图片到磁盘:

// 快捷办法:保存图片到磁盘
private func saveImageAttachment(
  image: UIImage,
  forIdentifier identifier: String
) -> URL? {
  // 1. 获取临时文件目录
  let tempDirectory = URL(fileURLWithPath: NSTemporaryDirectory())
  // 2. 在临时文件目录下,运用仅有字符串创立一个目录 URL
  let directoryPath = tempDirectory.appendingPathComponent(
    ProcessInfo.processInfo.globallyUniqueString,
    isDirectory: true)
  do {
    // 3. 创立一个空目录
    try FileManager.default.createDirectory(
      at: directoryPath,
      withIntermediateDirectories: true,
      attributes: nil)
    // 4. 依据图片标识符创立一个文件 URL
    let fileURL = directoryPath.appendingPathComponent(identifier)
    // 5. 将图片转换为 Data 方针
    guard let imageData = image.pngData() else {
      return nil
    }
    // 6. 测验将文件写入磁盘
    try imageData.write(to: fileURL)
      return fileURL
    } catch {
      return nil
  }
}

这便是你所做的:

  1. 获取临时文件目录。
  2. 在临时文件目录下,运用仅有字符串创立一个目录 URL。
  3. FileManager 负责创立实践的文件来存储数据。调用createDirectory(at:winthIntermediateDirectories:attributes:) 来创立一个空目录。
  4. 依据图片标识符创立一个文件 URL。
  5. 将图片转换为 Data 方针。
  6. 测验将文件写入磁盘。

现在你现已创立了一种存储图画的办法,你将把留意力转向下载实践的图画。

下载图片

增加一个经过 URL 下载图片的办法:

// 快捷办法:经过 URL 下载图片
private func getMediaAttachment(
  for urlString: String,
  completion: @escaping (UIImage?) -> Void
) {
  // 1. 保证你能从 urlString 特点中创立 URL
  guard let url = URL(string: urlString) else {
    completion(nil)
    return
  }
  // 2. 运用链接到这个 Target 的 ImageDownloader 测验下载
  ImageDownloader.shared.downloadImage(forURL: url) { result in
    // 3. 保证生成的图画不是 nil
    guard let image = try? result.get() else {
      completion(nil)
      return
    }
    // 4. 履行完结 Block 块,传递 UIImage 成果
    completion(image)
  }
}

它的效果非常简略。

  1. 保证你能从 urlString 特点中创立一个 URL
  2. 运用你链接到这个 Target 的 ImageDownloader 来测验下载。
  3. 保证生成的图画不是 nil
  4. 调用完结 Block 块,传递 UIImage 成果。

覆写从服务器获取的推送内容

你需求在你发送给设备的推送有效载荷中增加一些额外的值。进入 PushNotifications 开源运用,用这个有效载荷替换 body:

{
  "aps": {
    "alert": {
      "title": "New Podcast Available",
      "subtitle": "Antonio Leiva – Clean Architecture",
      "body": "This episode we talk about Clean Architecture with Antonio Leiva."
    },
    "mutable-content": 1
  },
  "podcast-image": "https://www.6hu.cc/files/2024/01/229607-yMnnov.png",
  "podcast-guest": "Antonio Leiva"
}

该有效载荷为你的推送告知供给了一个标题、一个副标题和一个 body。

留意 mutable-content 的值是 1,这个值告知 iOS 内容是可更新的,使其在向用户发送之前调用服务扩展。

增加了两个自定义键:podcast-imagepodcast-guest。你将运用与这些键相关联的值,在向用户显现告知之前更新推送内容。

现在发送带有上述内容的推送。你会看到一个更新的推送告知,并增加了标题、副标题和描述。它看起来是这样的。

iOS推送告知教程:Rich Push Notification

更新 Title

Notification Service Extension 的威力在于它阻拦推送告知音讯的才能。在本节中,你将会体验到这一点。在 WendercastNotificationService 中,翻开 NotificationService.swift,找到 didReceive(_:withContentHandler:)。这个函数将在推送告知到来时被调用,并答应你对要显现给用户的内容进行一些调整。

if let 块替换为以下内容:

if let bestAttemptContent = bestAttemptContent {
    // 1. 查看告知内容中 userInfo 中 podcast-guest 这个键的值
    if let author = bestAttemptContent.userInfo["podcast-guest"] as? String {
        // 2. 假如它存在,更新告知内容的标题
        bestAttemptContent.title = "New Podcast: (author)"
    }
    // 3. 调用完结处理程序来传递推送。假如 podcast-author 的值不存在,推送就会显现原始标题。
    contentHandler(bestAttemptContent)
}

你是这么做的:

  1. 查看告知内容中 userInfopodcast-guest 这个键的值。
  2. 假如它存在,更新告知内容的标题。
  3. 调用完结处理程序来传递推送。假如 podcast-author 的值不存在,推送就会显现原始标题。

构建并运转。然后将运用程序发送到后台。现在从推送告知测验程序发送推送。你应该会看到一个推送告知,标题现已更新,现在包括来自 podcast-author 条意图值。

iOS推送告知教程:Rich Push Notification

增加图片

接下来,你将运用推送音讯中的 payload 来下载代表播客集的图画。

contentHandler(bestAttemptContent) 这一行替换为以下内容:

/// 增加图片
// 1. 查看是否有 podcast-image 的值。假如没有,调用内容处理程序来传递推送并回来。
guard let imageURLString =
  bestAttemptContent.userInfo["podcast-image"] as? String else {
  contentHandler(bestAttemptContent)
  return
}
// 2. 调用快捷办法,用从推送 payload 中接纳到的 URL 来检索图片。
getMediaAttachment(for: imageURLString) { [weak self] image in
  // 3. 当完结块履行时,查看图画是否为 nil;不然,测验将其保存到磁盘。
  guard
    let self = self,
    let image = image,
    let fileURL = self.saveImageAttachment(
      image: image,
      forIdentifier: "attachment.png")
    // 4. 假如存在一个 URL,则阐明操作成功;假如这些查看中的任何一项失利,则调用内容处理程序并回来。
    else {
      contentHandler(bestAttemptContent)
      return
  }
  // 5. 用文件 URL 创立一个 UNNotificationAttachment。命名标识符图画,将其设置为终究告知上的图画。
  let imageAttachment = try? UNNotificationAttachment(
    identifier: "image",
    url: fileURL,
    options: nil)
  // 6. 假如创立附件成功,将其增加到 bestAttemptContent 的 attachments 特点中。
  if let imageAttachment = imageAttachment {
    bestAttemptContent.attachments = [imageAttachment]
  }
  // 7. 调用内容处理程序来传递推送告知。
  contentHandler(bestAttemptContent)
}

你是这么做的:

  1. 查看是否有 podcast-image 的值。假如没有,调用内容处理程序来传递推送并回来。
  2. 调用快捷办法,用从推送 payload 中接纳到的 URL 来检索图片。
  3. 当完结块履行时,查看图画是否为 nil;不然,测验将其保存到磁盘。
  4. 假如存在一个 URL,则阐明操作成功;假如这些查看中的任何一项失利,则调用内容处理程序并回来。
  5. 用文件 URL 创立一个 UNNotificationAttachment。命名标识符图画,将其设置为终究告知上的图画。
  6. 假如创立附件成功,将其增加到 bestAttemptContentattachments 特点中。
  7. 调用内容处理程序来传递推送告知。

构建并运转。将运用程序切换到后台履行。

现在,运用相同的有效载荷从推送告知测验程序发送另一个推送。你应该看到推送进来的时分,右上角有一张图片。

iOS推送告知教程:Rich Push Notification

拉下告知。你会看到它会扩展并运用图画来填充屏幕的大部分。

iOS推送告知教程:Rich Push Notification

厉害了!你现在能够更新你的告知内容了。接下来,您将进一步环绕您的推送内容创立自定义 UI。

创立自定义 UI

你能够经过在推送内容的顶部增加一个自定义 UI,让富文本告知更上一层楼。这个界面将经过运用扩展的办法替代规范的推送告知 UI。

iOS推送告知教程:Rich Push Notification

这个接口是一个恪守 UNNotificationContentExtension 的视图控制器。经过完结 didReceive(_:) 办法,你能够阻拦告知并设置你的自定义接口。

增加 Target

像之前相同, 点击 FileNewTarget…, 然后挑选 Notification Content Extension:

iOS推送告知教程:Rich Push Notification

将内容扩展命名为 WendercastNotificationContent 并保证字段正确(运用你自己的团队和安排称号)。

iOS推送告知教程:Rich Push Notification

这时,在 schema 激活承认界面点击 Activate 激活。

装备 Info.plist 文件

接下来,你需求装备新方针的 Info.plist 文件来显现你的内容扩展。

  1. WendercastNotificationContent 文件组中,翻开 Info.plist 文件。
  2. 展开 NSExtension 字典。
  3. 展开 NSExtensionAttribute 字典。
  4. UNNotificationExtensionCategory 中的值更新为 new_podcast_available
  5. 单击 + 将新键值对增加到 NSExtensionAttribute 字典中。
  6. 将键 UNNotificationExtensionDefaultContentHidden 增加为一个布尔值,并将值设置为YES
  7. 再增加一个布尔键值对。将键值设置为 UNNotificationExtensionUserInteractionEnabled,将值设置为 YES

你的终究 Info.plist 文件应该是这样的(键的顺序并不重要):

iOS推送告知教程:Rich Push Notification

下面是这些参数的效果:

UNNotificationExtensionCategory

  • 此条意图值必须与传入的推送内容中的一个值相匹配。iOS 需求它来决定运用哪个 UI 来显现告知。
  • 您需求它,由于您或许期望为不同类别的推送告知供给自定义用户界面。
  • 假如短少此值,iOS 将不会调用您的扩展。

UNNotificationExtensionInitialContentSizeRatio

  • 这个值是一个介于 0 和 1 之间的数字,它代表了你的自定义界面的长宽比。
  • 默认值为 1,它告知 iOS,你的初始界面高度和宽度是相同的。
  • 例如,假如你把这个值设置为 0.5,那么这将告知 iOS 你的界面高度是宽度的一半。
  • 这是一个估计值,答应 iOS 设置你界面的初始巨细,避免不必要的调整巨细。

UNNotificationExtensionDefaultContentHidden

  • 当设置为 YES 时,推送内容的规范标题、副标题和正文不可见。
  • 当设置为 NO 时,规范推送内容显现在自定义 UI 下方。

UNNotificationExtensionDefaultContentHidden

  • 当设置为 YES 时,能够完结用户与 UIKit 元素的交互。

增加 App Group

增加(你为 main app target 创立的)相同的运用程序组。

  1. 在文件导航中,单击 project。
  2. 挑选 WendercastNotificationContent target。
  3. 挑选 Signing & Capabilities 选项卡。
  4. 点击 + Capability
  5. 挑选 App Groups

挑选你在本教程开端时创立的同一个运用组 ID。

编译自定义 UI

你或许想专心于构建内容扩展逻辑,而不是把时刻糟蹋在繁琐的 Interface Builder 规划上。为了给你供给协助,本教程的下载内容现已包括了一个现成的 storyboard。能够随意运用它来替换 Xcode 主动创立的 storyboard。

下面是怎么做的过程:

  1. 在 Xcode 中,从 WendercastNotificationContent 组中删除 MainInterface.storyboard。在提示时挑选 Move to Trash
  2. 鄙人载资料中,将 ContentStoryboard 文件夹中的 MainInterface.storyboard 文件拖入 Xcode 中的 WendercastNotificationContent 文件夹。
  3. 勾选 Copy items if needed 单选框,并在 Add to targets 列表中挑选 WendercastNotificationContent 方针。
  4. 单击 Finish
  5. 在 Xcode 中翻开故事板。

你会看到这个故事板为告知用户界面供给了一个很好的起点。它为标题、播客图片、收藏夹按钮和播映按钮供给了 UI 元素。作为奖励,主动布局约束现已设置好了。

现在你能够专心于构建视图控制器。

创立 NotificationViewController

NotificationViewController 负责为你的用户出现自定义的告知视图。您将进行必要的修正,以出现您令人敬畏的新推送告知视图:]。

增加分享文件

翻开以下文件,并在文件查看器中增加 WendercastNotificationContent 到其方针成员中。

  • CoreDataManager.swift
  • PodcastItem.swift
  • Podcast.swift
  • DiskCacheManager.swift
  • Wendercast.xcdatamodel

你能够经过勾选 WendercastNotificationContent 框来完结。

iOS推送告知教程:Rich Push Notification

这将使数据模型和网络类可用于内容扩展。

留意:此时 Xcode 或许会感到困惑,显现一些错误。您只需按 Command-B 键建立方针即可铲除这些错误。

自定义 UI

查看 NotificationViewController 中的类声明下。删除 Xcode 主动生成的这段代码:

  • label
  • viewDidLoad()
  • didReceive(_:)‘s body

然后在类声明下增加以下插座:

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var favoriteButton: UIButton!
@IBOutlet weak var podcastTitleLabel: UILabel!
@IBOutlet weak var podcastBodyLabel: UILabel!

然后增加一个特点来寄存当前的播客:

var podcast: Podcast?

最后,增加以下快捷办法,从同享数据存储中加载播客:

// 从同享数据存储中加载播客
private func loadPodcast(from notification: UNNotification) {
  // 1. 试着从告知所顺便的 userInfo 方针中获取播客的链接。播客链接是播客在 Core Data 中存储的仅有标识符。
  let link = notification.request.content.userInfo["podcast-link"] as? String
  // 2. 假如链接不存在,则提早回来。
  guard let podcastLink = link else {
    return
  }
  // 3. 运用链接从 Core Data 存储中获取 Podcast 模型方针。
  let podcast = CoreDataManager.shared.fetchPodcast(
    byLinkIdentifier: podcastLink)
  // 4. 设置 podcast 作为呼应。
  self.podcast = podcast
}

这便是你上面要做的作业。

  1. 试着从告知所顺便的 userInfo 方针中获取播客的链接。播客链接是播客在 Core Data 中存储的仅有标识符。
  2. 假如链接不存在,则提早回来。
  3. 运用链接从 Core Data 存储中获取 Podcast 模型方针。
  4. 设置 podcast 作为呼应。

自定义告知

didReceive(_:) 的办法体替换为以下内容:

func didReceive(_ notification: UNNotification) {
    // 1. 调用快捷办法从 Core Data 存储中加载 podcast. 这样就能够设置 podcast,以便今后运用。
    loadPodcast(from: notification)
    // 2. 将标题和正文标签设置为从推送告知中接纳到的值。
    let content = notification.request.content
    podcastTitleLabel.text = content.subtitle
    podcastBodyLabel.text = content.body
    // 3. 测验拜访附加到服务扩展的媒体。假如没有,则提早回来。
    // 调用 startAccessingSecurityScopedResource() 答应你拜访附件。
    guard
      let attachment = content.attachments.first,
      attachment.url.startAccessingSecurityScopedResource()
      else {
        return
    }
    // 4. 获取附件的URL。试图从磁盘中检索它,并将数据转换为图画。假如失利,提早回来。
    let fileURLString = attachment.url
    guard
      let imageData = try? Data(contentsOf: fileURLString),
      let image = UIImage(data: imageData)
      else {
        attachment.url.stopAccessingSecurityScopedResource()
        return
    }
    // 5. 假如图画检索成功,设置播客图画并中止拜访资源。
    imageView.image = image
    attachment.url.stopAccessingSecurityScopedResource()
}

一旦有推送告知进来,你要做的便是上面的作业。

  1. 调用快捷办法从 Core Data 存储中加载 podcast. 这样就能够设置 podcast,以便今后运用。
  2. 将标题和正文标签设置为从推送告知中接纳到的值。
  3. 测验拜访附加到服务扩展的媒体。假如没有,则提早回来。调用 startAccessingSecurityScopedResource() 答应你拜访附件。
  4. 获取附件的URL。试图从磁盘中检索它,并将数据转换为图画。假如失利,提早回来。
  5. 假如图画检索成功,设置播客图画并中止拜访资源。

完结 Favorite 动作

UI 界面中有一个按钮,能够将告知的播客增加到收藏夹列表中。这是一个完美的比如,阐明怎么使推送告知变得可操作和酷。

增加以下办法来处理对收藏夹按钮的点击:

@IBAction func favoriteButtonTapped(_ sender: Any) {
  // 1. 查看是否有播客已被设置。
  guard let podcast = podcast else {
    return
  }
  // 2. 在 podcast 上查看 isFavorite。
  let favoriteSetting = podcast.isFavorite ? false : true
  podcast.isFavorite = favoriteSetting
  // 3. 更新 favorite 按钮 UI 以匹配模型状况。
  let symbolName = favoriteSetting ? "star.fill" : "star"
  let image = UIImage(systemName: symbolName)
  favoriteButton.setBackgroundImage(image, for: .normal)
  // 4. 更新 Core Data 存储。
  CoreDataManager.shared.saveContext()
}

要处理收藏夹按钮的点击,你履行了如下:

  1. 查看是否有播客已被设置。
  2. podcast 上查看 isFavorite
  3. 更新 favorite 按钮 UI 以匹配模型状况。
  4. 更新 Core Data 存储。

这足以测验你对内容扩展的第一套修正。将方案设置回 Wendercast,然后构建并运转,并将运用放到后台。接下来,从 Push Notifications 运用中发送以下内容:

{
  "aps": {
    "category": "new_podcast_available",
    "alert": {
      "title": "New Podcast Available",
      "subtitle": "Antonio Leiva – Clean Architecture",
      "body": "This episode we talk about Clean Architecture with Antonio Leiva."
    },
    "mutable-content": 1
  },
  "podcast-image": "https://www.6hu.cc/files/2024/01/229607-yMnnov.png",
  "podcast-link": "https://www.raywenderlich.com/234898/antonio-leiva-s09-e13",
  "podcast-guest": "Antonio Leiva"
}

告知进来后,往下拉。你会看到你更新的自定义界面:

iOS推送告知教程:Rich Push Notification

点击 Favorite 收藏按钮,你会看到它的状况发生变化。假如你翻开 Wendercast 运用到同一个播客,你会发现收藏按钮的状况与告知界面的状况一致。棒极了!

iOS推送告知教程:Rich Push Notification

完结 Play 动作

现在你将在运用程序中完结一个深度链接,用于播映操作。在 NotificationViewController 中增加以下办法:

@IBAction func playButtonTapped(_ sender: Any) {
  extensionContext?.performNotificationDefaultAction()
}

这告知告知扩展翻开运用程序,并以规范推送的办法传递一切。

接下来,看看 Wendercast/App/SceneDelegate.swift 中的扩展。这段代码履行了很多你在扩展中所做的相同作业。

  • 寻找播客链接的存在。
  • 试图从 Core Data 存储中获取播客。
  • 告知 PodcastFeedTableViewController 加载指定的播客。
  • 播映指定的播客。

构建并运转。将运用程序切换到后台,并推送前次发送的相同告知有效载荷。这一次,点击播映按钮。运用程序将深度链接到播客的详细信息,并开端流媒体的情节。你现已完结了!

何去何从?

恭喜你!你现已深入了解了富文本推送告知。您学会了怎么

  • 修正推送内容
  • 附上媒体
  • 创立自定义用户界面
  • 导航您的扩展和他们的主运用程序之间的互动。

要了解更多,您能够研究告知动作以及它们怎么运用于告知内容扩展。随着可定制的UI和用户互动的启用,或许性实践上是无限的! 要开端,请查看官方文档。

您能够点击教程顶部或底部的下载资料按钮,下载完结的项目文件。

假如您有任何意见或问题,请参加下面的论坛!