大多数浏览器和
Developer App 均支持流媒体播放。
-
发送通信和时效性通知
了解关于 Apple 平台上通知演变的更多信息。我们将探索您如何帮助人们在您的 app 中管理通知,包括您如何通过中断级别和时效性通知来创造精彩瞬间。同时,我们还将向您介绍通信通知,通过 SiriKit 在您的 app 中提供更加丰富的电话和信息体验。为了充分了解本节内容,我们建议您拥有创建本地和远程通知的经验,并多少熟悉 SiriKit 意图。
资源
相关视频
WWDC21
-
下载
♪低音音乐播放♪ ♪ 克里塔斯贾恩:大家好 欢迎观看 《发送通讯通知和时间敏感通知》 我是克里塔斯 通知团队的一名工程师 稍后我的同事凯文也会加入 通知是app体验的 一个关键组成部分 我们将介绍加强它们的新方法 以及提升某些类别的通知 我们首先会介绍 通知的一些视觉更新 以及如何使用新API增强它们 然后我们将概述新的管理控制 以及这些与通讯 和时间敏感通知的相关性 然后我们将专注于通知中断 并介绍控制它们的新API 之后 我们将深入讨论 两种类型的通知… 时间敏感和通讯 并介绍它们的配置方式 让我们从通知的一些视觉更新 开始介绍 现在 通知有了新的外观 更关注内容和相关媒体 以及app图标 丰富的通知展示 和伴随的操作 已经更新以匹配系统风格 你现在可以将通知操作 与图标串联起来 图像传达动作将要做什么 并在动作旁边提供视觉语境 这里有两个通知操作 喜欢和评论 它们是在自定义通知类别上设置的 要将图标添加到这些操作中 请使用具有图像名称的 UNNotificationActionIcon 类型的对象 可以是系统图片 也可以是模板图片 然后将这些图标提供给 UNNotificationAction的 相应构造函数 当此类别关联的通知展开时 将显示操作 以及为它们提供的图标 由于通知会以较大的尺寸 显示app图标 因此请在app包中提供高解析率图标 确保内容扩展继续与丰富通知的 新呈现和排版配合使用 并为通知操作采用图标 以添加更多上下文 接下来 让我们看一下新的通知管理选项 新的系统控件会影响 app通知的发送和中断 这些是通知摘要和专心模式 让我们先讨论通知摘要 通知现在可以在一天中的 预定时间以摘要形式发送 这减少了来自传入通知的 活动中断次数 并在预设时间内 集中呈现 按时间表发送到摘要的所有通知 都显示在锁定屏幕上的通知列表中 在通知内容中包含媒体附件 以便该通知更有可能 出现在通知摘要的最上方 采用新的API为通知内容 提供相关性评分 以便app的正确通知也能出现在 通知摘要中得到推荐 另一个与通知相关的管理工具 是专注模式 设备可以设置特定的专注模式 根据一天中的活动或时间 例如阅读、睡眠或工作 在这种配置下 设备将过滤通知的 显示和中断 专注模式 允许选择可以发送中断通知的 人和app 例如 在工作专注模式下 允许邮件和信息发送通知 以及来自同事的直接通讯 因此 通知摘要和专注模式 控制哪些app可以发送中断通知 以及何时发送 这样可以更好地管理 一天下来的活动中断 通知有机会突破 这些管理控制 但只有在允许的情况下才能这么做 通讯和时间敏感通知 也可以突破 接下来让我们讨论app 如何控制与通知相关的中断 作为UserNotifications 框架的一部分 有一个用于中断级别的新API 支持四种不同的 中断级别 分别是被动、主动、时间敏感和关键 具有被动中断级别的通知 不会发出提醒或点亮屏幕 也不会突破系统控制 这些通知以静默方式 传送到通知列表 并在下次查看列表时可用 被动中断应用于 不需要立即中断注意力 但最终需要看到的通知 像是餐饮推荐 和新影集发布 主动中断类似于现在存在的行为 通知会播放声音和震动 并点亮屏幕 这些通知不会突破 通知的系统管理 这是默认的中断级别 活动中断应该用于不需要 中断的通知 如果系统配置为 目前不被中断 比方像是体育更新 和直播视频通知 时间敏感通知提醒 就像活动通知一样 它们的特殊之处在于 它们可以突破系统控制 例如通知摘要和专注模式 如果允许的话 这些通知应该只在 与主动中断相关 且需要立即关注时使用 比方说账户安全 和包裹递送提醒 最后 关键中断级别相当于 iOS 14中存在的关键通知支持 具有此中断级别的通知 会主动提醒 突破系统控制 还会绕过设备上的铃声开关 由于这种破坏性行为 关键中断将继续 需要获得批准的授权 关键通知的例子像是 恶劣天气和本地安全警报 为了支持UserNotifications 框架中的新API UNNotificationInterruptionLevel 有一个新的枚举 定义了不同的级别 在为通知请求配置内容对象时 设置此中断级别 本例中设置为被动 如果未提供中断级别 则使用默认级别 对于推送通知内容 提供一个新的键值对 以及键中断级别 同样的 将中断级别设置为被动 当这个通知被发送到设备上时 它会在锁定屏幕上显示 而不会中断 因为它被设定为被动 另一种与通知相关的中断形式 是宣布 Siri可以宣布通知 如果有兼容设备 例如AirPods Pro 和AirPods Max连接到设备上 要在iOS 14中获得此宣布行为 通知必须绑定到 请求AllowAnnouncement选项的类别 在iOS 15中 不建议使用 此类别选项 现在 当连接到支持的音频设备时 任何通知都支持宣布 通讯和时间敏感通知 将默认宣布 当连接到CarPlay时 通讯通知 可以配置为自动宣布 使体验更加无缝 接下来让我们关注时间敏感通知 以及如何配置 时间敏感通知 是那些需要立即关注的通知 由于它们的重要性 如果允许 它们可以突破系统控制 例如通知摘要和专注模式 时间敏感通知的一个例子 是关于服用药物的提醒 这个通知会立即和强调发布 突破工作专心模式 发送时间敏感通知时 保持信任很重要 不要过度使用它们的中断性质 只在相关的时候使用它们 要知道 有一个选项 可以关闭时间敏感的提醒 甚至来自app的所有通知 要配置时间敏感通知 请通过Xcode为你的app 启用相关功能 在发布的通知请求上 设置时间敏感中断级别 对于本地通知 时间敏感中断级别 设置在内容对象上 对于推送内容 将中断级键的值设置为时间敏感 送达时 此通知会张贴在显眼位置 突出紧急性 让我们来讨论一下通讯通知 下面有请凯文为大家介绍 凯文? 凯文哈灵顿:谢谢 克里塔斯 我是通知团队的工程师凯文 突破专注模式和通知摘要的 紧急通知很重要 来自人们的交流也保证了 优先的通知发送 这些通讯可以以多种形式出现 包括来电和信息 我将重点介绍一个新的API 它允许你的app 指示哪些通知是通讯 以及与这些通讯相关联的人员 通讯通知的重要性 由使用者决定 Siri建议有助于为这些决定提供信息 建议应该允许重要的人打断 当你的使用者与设备交流时… 接听电话、加入FaceTime通话 发送信息 Siri会了解谁可以突破专注模式 和通知摘要 在iOS 15中 通讯通知 获得了更丰富的使用者体验 最明显的是突出的虚拟角色 标题和副标题是标准化的 它总是在标题中包含发件人 在群组通讯的情况下 副标题中包含收件人 标题和副标题文本已针对所有设备 跨平台进行了本地化和格式化 例如 watch更喜欢只显示 群组通讯收件人的名字 Siri现在将在 支持的设备上 宣布通讯通知的内容 包括 HomePod、AirPods和CarPlay Siri还会提供建议 以帮助区分这些通讯通知的优先级 你app中的使用者 将与通讯簿中的用户联系在一起 这些关联显示为 通知上的建议 一旦使用者确认建议后 Siri快捷方式可用于与你的app中的 这些人一起执行任务 Siri会建议相关人员突破 专注模式 包括那些 与你的app中的通讯相关的人员 为了决定什么是通讯 和什么不是通讯 这个新API允许你将 SiriKit来电和信息意图 添加到通知 意图由常见任务驱动 当事件发生时 你的app会贡献这些意图 例如打电话或接收信息 在此基础上 Siri根据这些意图 提供快捷方式和建议 例如你app中的人从共享表发送信息 或通过Siri从你的app打电话 这个新的API将这些 相同的意图与通知相关联 以进一步将你的app 集成到Siri生态系统中 将SiriKit意图用于通讯通知 将增加你的app的参与度 同时在你的app Siri和系统UI中保持一致性 表示相关通讯的意图 是StartCall和SendMessage意图 NotificationContentProviding协议 是一种将意图与通知相关联的机制 在NotificationContent对象上 使用ContentProviding意图调用更新 以进行通讯处理 StartCall和SendMessage 意图符合提供 通讯通知通过 Apple推播通知服务传送 你需要在app的 NotificationServiceExtension中 使用SiriKit意图 更新NotificationContent对象 SiriKit意图是本地的设备 因此必须在本地提供服务 服务扩展正是针对这些情况 它是在发送远程通知之前 自定义远程通知内容的地方 你也可以在你的主app进程中 为本地通知执行此操作 在你的didReceive函数中 使用意图更新推播的内容 对于信息通知 创建一个 SendMessageIntent 对于与来电相关的通知 请使用StartCallIntent 创建互动以告诉Siri智能 正在发生的事情 在通知扩展中 互动方向始终是来电 这是发生在使用者身上的事件 他们正在接听来电 接下来 你需要贡献互动 贡献也有助于系统 在未来提出更好的建议 更新通知的内容 最后 使用返回的意图 调用contentHandler 贡献是必要的 以便Siri可以从你的app中 发生的事件中学习 互动方向 总是传入通知 对于其他SiriKit用途 方向可以是在设备上 发起的操作的传出 例如发送传出信息或拨打电话 只支持符合内容提供的 系统对象 不要使对象与内容提供一致 要发送通讯通知 请通过Xcode为你的app 启用通讯功能 通过将意图类型 添加到Info.plist中的 使用者活动类型数组 或通过实施意图扩展来支持通讯意图 当使用者在你的app 前台执行操作时 例如用户在撰写信息后 点击发送时 贡献通讯意图 然后Siri使用外向意图来更好地帮助 谁应该建议 突破专注模式和通知摘要 联络人建议也是如此 对于这项功能 Siri只会从传出的意向贡献中学习 因此联络人不会被未参与的人 例如骚扰电话 弄得杂乱无章 通讯意图的正确使用 是智能通知体验的基础 这里有一些问题需要注意 意向人员是SendMessage 和StartCall意向的构建块 你填入的每个参数 都提供了更丰富 更智能的使用者体验 与有意图的人一起创建意图也是如此 你填入的每个参数 都提供了更丰富 更智能的使用者体验 如果你还没有使用意图 请开始使用 意图将在通知、共享表 联络人和聚焦中 为你的app提供更多曝光度 你还可以使用SiriKit提供Siri快捷方式 例如发送信息或拨打电话 养成对传入和传出 互动贡献意图的习惯 你可能已经在贡献传出意图 开始在你的服务扩展功能中 贡献传入的StartCall 和SendMessage意图 这是通讯通知 体验的基础 如果你的app尚未使用 通知服务扩展功能 你会需要添加一个 最后 通过使用内容 提供协议来修饰 你希望作为通讯发送的每个通知 将各个部分组合在一起 我们在本节中讨论了很多内容 从视觉更新到通讯通知 以下是一些要点 考虑新的视觉更新和管理选项 并确保通知与它们合作无间 采用中断级别可以更好地 控制通知 如何与系统控制合作 使用时间敏感通知 当重要的中断和获得自动行为 例如突破和宣布 实施和贡献来电和信息意图 以获得与通知相关的 升级通讯体验 以及突破和宣布行为 我们迫不及待地想看到你围绕通知 创造的全新体验 我们希望各位都有个美好的WWDC! ♪
-
-
1:57 - Notification Action Icons
// Setting up notification actions with icons let likeActionIcon = UNNotificationActionIcon(systemImageName: "hand.thumbsup") let likeAction = UNNotificationAction(identifier: "like-action", title: "Like", options: [], icon: likeActionIcon) let commentActionIcon = UNNotificationActionIcon(templateImageName: "text.bubble") let commentAction = UNTextInputNotificationAction(identifier: "comment-action", title: "Comment", options: [], icon: commentActionIcon, textInputButtonTitle: "Post", textInputPlaceholder: "Type here…") let category = UNNotificationCategory(identifier: "update-actions", actions: [likeAction, commentAction], intentIdentifiers: [], options: [])
-
8:19 - Notification Interruption Levels
// Interruption levels let enum UNNotificationInterruptionLevel : Int { case passive = 0 case active = 1 case timeSensitive = 2 case critical = 3 public static var `default`: UNNotificationInterruptionLevel { get } }
-
8:31 - Passive Notification: Local
// Interruption levels // Local notification import UserNotifications let content = UNMutableNotificationContent() content.title = "Passive" content.body = "I’m a passive notification, so I won’t interrupt you." content.interruptionLevel = .passive let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) let request = UNNotificationRequest(identifier: "passive-request-example", content: content, trigger: trigger)
-
8:47 - Passive Notification: Push
// Interruption levels // Push notification { "aps" : { "alert" : { "title" : "Passive", "body" : "I’m a passive notification, so I won’t interrupt you." } "interruption-level" : "passive" } }
-
11:13 - Time Sensitive Notification: Local
// Time Sensitive // Local notification let content = UNMutableNotificationContent() content.title = "Urgent" content.body = "Your account requires attention." content.interruptionLevel = .timeSensitive let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0, repeats: false) let request = UNNotificationRequest(identifier: "time-sensitive—example", content: content, trigger: trigger)
-
11:20 - Time Sensitive Notification: Push
// Time Sensitive // Push notification { "aps" : { "alert" : { "title" : "Urgent", "body" : "Your account requires attention." } "interruption-level" : "time-sensitive" } }
-
15:20 - Notification Content Providing
// New UserNotifications API @available(macOS 12.0, *) public protocol UNNotificationContentProviding : NSObjectProtocol {} open class UNNotificationContent : NSObject, NSCopying, NSMutableCopying, NSSecureCoding { // ... @available(macOS 12.0, *) open func updating(from provider: UNNotificationContentProviding) throws -> UNNotificationContent // ... }
-
16:08 - Communication Notification: Incoming message
// Create a messaging notification // In UNNotificationServiceExtension subclass func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { let incomingMessageIntent: INSendMessageIntent = // ... let interaction = INInteraction(intent: incomingMessageIntent, response: nil) interaction.direction = .incoming interaction.donate(completion: nil) do { let messageContent = try request.content.updating(from: incomingMessageIntent) contentHandler(messageContent) } catch { // Handle error } }
-
16:20 - Communication Notification: Incoming call
// Create a call notification // In UNNotificationServiceExtension subclass func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { let incomingCallIntent: INStartCallIntent = // ... let interaction = INInteraction(intent: incomingCallIntent, response: nil) interaction.direction = .incoming interaction.donate(completion: nil) do { let callContent = try request.content.updating(from: incomingCallIntent) contentHandler(callContent) } catch { // Handle error } }
-
17:48 - Communication Notification: Outgoing message
func sendMessage(...) { // ... let intent: INSendMessageIntent = // ... let interaction = INInteraction(intent: intent, response: nil) interaction.direction = .outgoing interaction.donate(completion: nil) }
-
18:29 - Communication Notification: INPerson
// Create INPerson let person = INPerson(personHandle: handle, nameComponents: nameComponents, displayName: displayName, image: image, contactIdentifier: contactIdentifier, customIdentifier: customIdentifier, aliases: nil, suggestionType: suggestionType)
-
18:43 - Communication Notification: INSendMessageIntent
// Create INSendMessageIntent // In your notification service extension let intent = INSendMessageIntent(recipients: [person2], outgoingMessageType: .outgoingMessageText, content: content, speakableGroupName: speakableGroupName, conversationIdentifier: conversationIdentifier, serviceName: serviceName, sender: person1, attachments: nil) let interaction = INInteraction(intent: intent, response: nil) interaction.direction = .incoming
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。