WWDC Quick Look 💓 By SwiftGGTeam
Integrate your app with Wind Down

Integrate your app with Wind Down

观看原视频

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:14shortcutAvailability 同时存在于 INIntentNSUserActivity。它告诉系统:这个动作适合出现在 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,然后通过 INVoiceShortcutCentersetShortcutSuggestions 交给系统。这样,用户在 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,设置 suggestedInvocationPhraseshortcutAvailability,最后把它赋给 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

关键点:

  • isEligibleForSearchisEligibleForPrediction 对应 transcript 中 08:44 的要求。
  • titlesuggestedInvocationPhrase 都会影响系统展示,后者还会用于 Siri 触发。
  • .sleepJournaling 对应 Wind Down 中的 journaling 场景,适合日记、情绪记录和睡前回顾。
  • viewController.userActivity = activity 是演讲中提到的 donation 方式,适合已有页面行为。

5. 短语要为锁屏空间设计

09:02suggestedInvocationPhrase 不是装饰字段。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,设置 isEligibleForSearchisEligibleForPredictiontitlesuggestedInvocationPhrase.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

评论

GitHub Issues · utterances