将你的 App 接入「睡眠模式」
Integrate your app with Wind Down
2020年6月24日
一句话判断
如果你的 App 属于冥想、白噪音、睡前阅读这类场景,接入 Wind Down 可以让系统在睡前自动推荐你的 App,这是零成本的自然流量入口。
这场 Session 讲了什么
iOS 14 对健康 App 的睡眠功能做了重大升级,引入了 Wind Down(睡眠模式)概念。用户可以设置就寝时间,系统会在就寝前一段时间自动进入 Wind Down 状态——屏幕变暗、通知静音,同时推荐用户选择的”放松活动”相关 App。
你的 App 可以通过 Wind Down Shortcuts 接入这个流程。用户在设置睡眠日程时,可以选择在 Wind Down 期间打开哪些 App。这些快捷方式会被放在锁屏和通知中心,用户一键就能进入你的 App 的放松模式。Session 重点介绍了如何通过 Intents 和 Shortcuts 框架让你的 App 的核心功能成为 Wind Down 流程的一部分。
值得深挖的点
Wind Down 的用户旅程
Wind Down 的设计思路是”减少阻力”:用户不需要在睡前翻找 App,系统会主动把相关功能推到最显眼的位置。这对开发者来说是一个全新的触达通道。当用户的 iPhone 进入 Wind Down 模式后,锁屏界面会出现用户选择的 App 快捷方式,点击即可直接跳转到 App 的特定功能页面。这意味着你的 App 需要提供一个”即开即用”的入口,比如直接播放白噪音、直接打开阅读页面。
NSUserActivity 与 Wind Down 的结合
Wind Down Shortcuts 基于 NSUserActivity 框架。你需要为你的”放松功能”定义一个 NSUserActivity,用户在设置中添加时就会看到这个 Activity。当 Wind Down 触发时,系统会通过这个 Activity 来唤起你的 App 并恢复到之前的状态。你需要确保 activity.userInfo 中包含足够的信息来恢复上下文。
代码片段
定义 Wind Down 快捷方式
场景:为白噪音 App 定义一个”开始播放”的 Wind Down 快捷方式。
import Intents
// 在 AppDelegate 或 SceneDelegate 中定义 Activity
func createWindDownActivity() -> NSUserActivity {
let activity = NSUserActivity(activityType: "com.yourapp.winddown.play")
// 设置为 Wind Down 快捷方式
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true
// 标记为睡眠模式相关
activity.suggestedInvocationPhrase = "播放白噪音"
// 保存恢复上下文所需的信息
activity.userInfo = [
"action": "playSoundscape",
"soundId": "rain-light"
]
activity.title = "播放雨声"
activity.keywords = Set(["睡眠", "放松", "白噪音", "冥想"])
// 成为当前 Activity
activity.becomeCurrent()
return activity
}
在 SceneDelegate 中处理 Wind Down 唤起
场景:当用户从 Wind Down 锁屏点击快捷方式时恢复 App 状态。
// 处理通过 NSUserActivity 唤起的场景
func scene(_ scene: UIScene,
restoreInteractionWith state: NSUserActivityStateRestoring) {
guard let activity = state as? NSUserActivity,
activity.activityType == "com.yourapp.winddown.play" else {
return
}
// 从 userInfo 中恢复上下文
if let action = activity.userInfo?["action"] as? String,
action == "playSoundscape",
let soundId = activity.userInfo?["soundId"] as? String {
// 直接开始播放,不要显示任何额外的引导页面
startPlayingSoundscape(id: soundId)
}
}
使用 SiriKit Intent 提供更丰富的快捷方式
场景:通过自定义 Intent 让用户在 Shortcuts 中配置更复杂的睡前操作。
// 在 Intent 定义文件中创建自定义 Intent
// StartSleepSounds Intent
class StartSleepSoundsIntentHandler: NSObject, StartSleepSoundsIntentHandling {
func handle(intent: StartSleepSoundsIntent,
completion: @escaping (StartSleepSoundsIntentResponse) -> Void) {
let soundType = intent.soundType
let duration = intent.duration
// 配置播放参数
let player = SoundPlayer.shared
player.configure(sound: soundType, duration: duration)
// 返回成功响应
let response = StartSleepSoundsIntentResponse.success(
soundName: player.currentSoundName
)
completion(response)
}
// 提供 SoundType 选项
func provideSoundTypeOptions(for intent: StartSleepSoundsIntent,
with completion: @escaping ([SoundType]?, Error?) -> Void) {
let options: [SoundType] = [
.init(identifier: "rain", display: "雨声"),
.init(identifier: "ocean", display: "海浪"),
.init(identifier: "forest", display: "森林")
]
completion(options, nil)
}
}
最佳实践
已有项目:如果你的 App 已经有 Shortcuts 或 SiriKit 集成,接入 Wind Down 非常简单。把现有的 Intent 标记为适合睡眠模式的场景,添加 suggestedInvocationPhrase 即可。重点优化”从锁屏到核心功能”的路径,不要让用户经过任何多余的页面。
新项目:从产品设计阶段就考虑 Wind Down 场景。想想你的 App 有什么功能适合”睡前 30 分钟”这个时间窗口。确保进入核心功能的路径不超过一次点击。在 Info.plist 中正确声明 NSUserActivityTypes。
还有什么值得关注
- HealthKit 现在可以读取用户的睡眠日程数据(需要用户授权),你可以据此智能调整 App 行为。
- Wind Down 快捷方式会出现在 Siri Suggestions 中,不局限于睡眠时间,用户白天也可能通过建议发现你的功能。
- 建议配合 Widget(桌面小组件)一起使用,让用户在锁屏和主屏都能快速访问放松功能。