Highlight
iOS 14 对健康 App 的睡眠功能做了重大升级,引入了 Wind Down(睡眠模式)概念。用户可以设置就寝时间,系统会在就寝前一段时间自动进入 Wind Down 状态——屏幕变暗、通知静音,同时推荐用户选择的”放松活动”相关 App。
核心内容
睡前流程最怕多一步。用户已经准备休息,如果还要解锁手机、翻找 App、再进入某个冥想、日记或白噪音页面,这个动作本身就会打断 Wind Down。iOS 14 的 Health App 把睡眠设置扩展成一个系统级流程:用户设置睡眠日程后,可以在 Wind Down 期间从锁屏直接运行选好的 Shortcuts。
这场 session 讲的就是开发者怎样进入这个入口。Apple 把这类入口称为 Wind Down Shortcuts。它们可以来自 App 的 intent,也可以来自 NSUserActivity。开发者要做的第一件事,是判断 App 里哪些动作真的适合睡前:开始睡眠冥想、播放放松音景、写晚间日记、设置柔和灯光,都符合场景;热身跑步或开始会议就不适合。
进入系统推荐之后,动作还要足够好认。Wind Down 的锁屏空间很小,用户看到的是一条短短的 shortcut 名称。session 反复强调 suggestedInvocationPhrase,因为这句话既是 Siri 语音触发短语,也是锁屏上描述 shortcut 的文字。一个好短语应该短、具体,并且能区分同一个 App 里的不同动作。
详细内容
1. 用 shortcutAvailability 标记睡前类别
(02:38)Wind Down 的入口面向 App 里的具体动作,而非整个 App。session 明确说,主要方式是 intent:可以采用系统内置 intent,例如 INCreateNoteIntent,也可以定义自定义 intent。完成 intent 后,为它设置新的 shortcutAvailability 属性。
(03:14)shortcutAvailability 同时存在于 INIntent 和 NSUserActivity。它告诉系统:这个动作适合出现在 Wind Down 设置流程里的哪个类别。演讲举了几个类别:冥想 App 可以使用 mindfulness,准备明天的 Notes 或 Weather App 可以使用 Prepare for Tomorrow,白噪音 App 可以使用 sleep music,瑜伽 App 可以使用 yoga and stretching。
import Intents
let intent = INPlayMediaIntent(
mediaItems: nil,
mediaContainer: nil,
playShuffled: nil,
playbackRepeatMode: .unknown,
resumePlayback: nil,
playbackQueueLocation: .unknown,
playbackSpeed: nil,
mediaSearch: nil
)
intent.shortcutAvailability = [.sleepMusic]
intent.suggestedInvocationPhrase = "Play Counting Sleepy Dinosaurs"
关键点:
INPlayMediaIntent对应 transcript 中的 Bedtime 示例,用来启动音频播放。.sleepMusic对应 04:46 提到的 sleep music 选项,适合白噪音、睡前音乐和放松音景。suggestedInvocationPhrase对应 07:36 和 10:19 的讲解,系统会把它作为锁屏上的 shortcut 名称。- 这里没有构造真实媒体项,因为 session 的重点是 Wind Down 标记;媒体搜索和播放细节可以继续看 SiriKit Media Intents 相关 session。
2. 用 INVoiceShortcutCenter 主动建议关键动作
(04:35)Bedtime 示例的第一条路径是 suggestion。App 创建 intent,设置 shortcutAvailability,包装成 INShortcut,然后通过 INVoiceShortcutCenter 的 setShortcutSuggestions 交给系统。这样,用户在 Health App 设置 Wind Down 时,就能在 Music 类别看到这个动作。
(06:07)session 特别提醒:如果 App 的动作列表发生变化,要重新调用 setShortcutSuggestions。这样 Wind Down 设置流程里只会出现当前最相关的动作。
let shortcut = INShortcut(intent: intent)
if let shortcut {
INVoiceShortcutCenter.shared.setShortcutSuggestions([shortcut])
}
关键点:
INShortcut(intent:)是把 intent 变成系统可展示 shortcut 的包装步骤。INVoiceShortcutCenter.shared对应 transcript 中的 shared property。setShortcutSuggestions适合放入 App 始终希望用户发现的核心睡前动作,例如“播放今日音景”。- suggestion 的价值是可控:开发者可以确保某些动作在 Wind Down 设置中被展示。
3. 在真实使用时 donation,让系统学习用户偏好
(06:32)第二条路径是 donation。用户在 App 日常使用中执行某个动作时,App 把这个 intent 或 user activity 捐赠给系统。系统据此理解哪些动作对这个用户更重要,并把它们放到 Wind Down 设置、搜索和锁屏建议等位置。
(07:58)演讲展示的 intent donation 流程是:初始化 intent,设置 shortcutAvailability,设置 suggestedInvocationPhrase,包装成 INInteraction,最后调用 donate。
let playedTrackIntent = intent
playedTrackIntent.suggestedInvocationPhrase = "Play Counting Sleepy Dinosaurs"
let interaction = INInteraction(intent: playedTrackIntent, response: nil)
interaction.donate { error in
if let error {
// 在真实 App 中记录 donation 失败,避免静默丢失系统推荐机会。
print(error)
}
}
关键点:
- donation 要发生在用户真的执行动作之后,例如播放了一条白噪音音轨。
INInteraction是 intent donation 的容器,transcript 在 08:30 明确提到它。- phrase 可以使用音轨名,这样锁屏上出现的文字比 “Play sound” 更容易识别。
- donation 和 suggestion 应该同时做:suggestion 保证核心动作可见,donation 帮系统学习个人偏好。
4. 用 NSUserActivity 支持非 intent 动作
(08:39)如果 App 已经用 NSUserActivity 表示某个动作,也可以走 Wind Down。session 给出的顺序是:初始化 user activity,设置 eligible for search 和 eligible for prediction,设置 title,设置 suggestedInvocationPhrase 和 shortcutAvailability,最后把它赋给 view controller 的 userActivity 属性完成 donation。
let activity = NSUserActivity(activityType: "com.example.bedtime.journal")
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true
activity.title = "Night Journal"
activity.suggestedInvocationPhrase = "Open Night Journal"
activity.shortcutAvailability = [.sleepJournaling]
viewController.userActivity = activity
关键点:
isEligibleForSearch和isEligibleForPrediction对应 transcript 中 08:44 的要求。title和suggestedInvocationPhrase都会影响系统展示,后者还会用于 Siri 触发。.sleepJournaling对应 Wind Down 中的 journaling 场景,适合日记、情绪记录和睡前回顾。viewController.userActivity = activity是演讲中提到的 donation 方式,适合已有页面行为。
5. 短语要为锁屏空间设计
(09:02)suggestedInvocationPhrase 不是装饰字段。session 明确说,它会被用于命名 App 的 shortcut,也会显示在 Wind Down 期间的锁屏上。因为锁屏空间有限,短语要短而具体。
(09:37)Bedtime 的例子是 “Play Counting Sleepy Dinosaurs”。它包含具体音轨名,用户能和 App 里的其他声音区分开。反例是 “Play sound”,这个名字太泛,无法告诉用户到底会播放什么。
intent.suggestedInvocationPhrase = "Play Counting Sleepy Dinosaurs"
关键点:
- 短语要能唯一识别动作,尤其是同一个 App 暴露多个睡前内容时。
- 删除多余词,避免 Wind Down 锁屏截断。
- 用用户认识的对象名,例如音轨、冥想课程、日记模板或睡前清单。
- 这个短语在 suggestion 和 donation 两条路径里都要设置。
核心启发
1. 做一个睡前音景入口
做什么:把 App 里的白噪音、睡前音乐或放松故事做成 Wind Down Shortcut。
为什么值得做:session 的 Bedtime 示例正是用 INPlayMediaIntent 启动音景,并用 .sleepMusic 让它进入 Wind Down 的 Music 类别。
怎么开始:先选一个最常用音轨,创建 INPlayMediaIntent,设置 .sleepMusic 和短 phrase,再用 INVoiceShortcutCenter.shared.setShortcutSuggestions 暴露给系统。
2. 做一个晚间日记快捷入口
做什么:让用户从锁屏直接打开晚间日记、心情记录或睡前复盘页面。
为什么值得做:transcript 在 Health 设置流程里举了 Day One journaling 的例子,NSUserActivity 又支持设置 shortcutAvailability。
怎么开始:为日记页面创建 NSUserActivity,设置 isEligibleForSearch、isEligibleForPrediction、title、suggestedInvocationPhrase 和 .sleepJournaling,再绑定到当前 view controller。
3. 做一个“准备明天”清单
做什么:在睡前展示明天的重要事项、天气、第一场会议或旅行提醒。
为什么值得做:session 把 Notes 和 Weather 这类 App 放进 Prepare for Tomorrow 场景,说明 Wind Down 不只服务放松,也服务第二天的准备。
怎么开始:把“查看明天摘要”建成 intent 或 user activity,短语用 “Review Tomorrow”,并在用户经常查看日程后进行 donation。
4. 做一个睡前拉伸或冥想入口
做什么:把一节固定时长的睡前瑜伽、呼吸练习或冥想课程放到 Wind Down。
为什么值得做:session 明确区分了适合睡前的 yoga for relaxation 和不适合睡前的 warm-up run,开发者要挑选真正帮助入睡的动作。
怎么开始:从 App 内最轻量的课程开始,设置 mindfulness 或 yoga and stretching 类别,并把 phrase 写成课程名,而不是泛泛的 “Start session”。
关联 Session
- What’s new in SiriKit and Shortcuts — 2020 年 SiriKit 与 Shortcuts 更新总览,包含 compact Siri UI、Shortcuts 组织方式和 Wind Down 标记。
- Feature your actions in the Shortcuts app — 说明如何让 App 动作进入 Shortcuts App、自动化建议和系统智能推荐入口。
- Empower your intents — 讲解 intent 处理、in-app intent handling、富会话展示和 SiriKit 集成方式。
- Create quick interactions with Shortcuts on watchOS — 说明 Shortcuts 在 Apple Watch 上的运行、complication 入口和 intent 路由。
- Expand your SiriKit Media Intents to more platforms — 讲解音乐和音频 App 如何通过 INPlayMediaIntent 支持 Siri 媒体播放请求。
评论
GitHub Issues · utterances