WWDC Quick Look 💓 By SwiftGGTeam
Meditation for fidgety skeptics

Meditation for fidgety skeptics

观看原视频

Highlight

Apple 在 WWDC21 安排 Dan Harris 和 Jeff Warren 讲解冥想入门方法,开发者获得了把压力管理、专注训练和习惯形成转化为健康类 App 功能的清晰流程。

核心内容

这场 session 没有发布新的 Apple API。它解决的是另一个开发者常见问题:长期盯着屏幕、赶进度、处理线上事故之后,身体还坐在椅子上,注意力已经被焦虑、疲劳和冲动牵走。

Dan Harris 从一次电视直播中的恐慌发作讲起。他把根源追到长期高压工作、战地报道后的抑郁,以及错误的自我处理方式。后来他开始每天练习五到十分钟冥想,并总结出三个结果:更平静、更专注、更能察觉脑中的念头。

Apple 把这场演讲放在 Health & Fitness 主题下。重点很直接:健康应用只记录步数、心率、睡眠还不够。用户真正需要的,是在压力出现时,有一个可执行的小动作,帮助他们暂停、识别、回到当下。

Jeff Warren 给出的练习流程很短。坐下,做几次深呼吸,放松额头、肩膀和腹部。选择一个注意对象,比如呼吸。走神时发现它,再回到呼吸。这个循环就是练习本身。

对 App 开发者来说,这场 session 的价值在于产品结构。一个好的冥想或心理健康功能,不需要先追求长时长课程。它可以从一分钟开始,以「低门槛、可重复、允许中断后重启」为核心,帮助用户建立稳定习惯。

详细内容

1. 从一分钟开始设计习惯

14:17

Dan Harris 给出的最低门槛是:31 天里有 25 天,每天至少一分钟。他强调两个短句:One minute countsdaily-ish。前者降低开始成本,后者给用户留下恢复空间。

这个规则可以先写成一个纯 Swift 模型。它不依赖任何私有 API,也没有假设新的系统能力。

import Foundation

struct MeditationCheckIn {
    let date: Date
    let minutes: Int
}

struct DailyIshHabit {
    let targetDays = 25
    let windowDays = 31

    func isOnTrack(checkIns: [MeditationCheckIn], calendar: Calendar = .current) -> Bool {
        let practicedDays = Set(checkIns
            .filter { $0.minutes >= 1 }
            .map { calendar.startOfDay(for: $0.date) })

        return practicedDays.count >= targetDays
    }
}

关键点:

  • MeditationCheckIn 只记录日期和练习分钟数,对应「至少一分钟」这个门槛。
  • targetDays 是 25,对应 Dan 提到的 25 out of 31 days。
  • windowDays 保留 31 天窗口,方便界面展示目标周期。
  • filter { $0.minutes >= 1 } 把一分钟以下的记录排除。
  • calendar.startOfDay(for:) 把同一天的多次练习合并成一天。
  • practicedDays.count >= targetDays 用完成天数判断用户是否仍在轨道上。

这个模型的产品含义是:不要把漏练一天做成失败状态。界面可以显示「本周期已完成 18 天,还差 7 天」,用户更容易继续。

2. 把冥想拆成可执行的状态机

17:29

Jeff Warren 的五分钟练习有清晰顺序:准备姿势,深呼吸,放松身体,接受环境中的不完美,选择呼吸作为注意对象,发现走神,回到呼吸。

把它写成状态机,App 就能稳定控制文案、计时和震动提示。

enum MeditationStep: String, CaseIterable {
    case posture
    case deepBreath
    case softenBody
    case allowExperience
    case noticeBreath
    case returnToBreath
    case close

    var prompt: String {
        switch self {
        case .posture:
            return "选择一个舒服的坐姿,眼睛可以闭上,也可以看向地面。"
        case .deepBreath:
            return "做几次深呼吸,吸气时伸展脊柱,呼气时放松。"
        case .softenBody:
            return "放松额头、肩膀和腹部。"
        case .allowExperience:
            return "让声音、身体感觉和念头自然出现。"
        case .noticeBreath:
            return "把注意力放到呼吸的感觉上。"
        case .returnToBreath:
            return "发现走神后,回到呼吸。"
        case .close:
            return "观察此刻是否更稳定、更在场,然后睁开眼睛。"
        }
    }
}

关键点:

  • MeditationStep 对应逐字稿中的练习步骤。
  • CaseIterable 让界面可以按顺序遍历所有步骤。
  • prompt 把每一步转成用户能直接照做的一句话。
  • posture 来自 Jeff 让听众选择舒适姿势的引导。
  • softenBody 对应放松额头、肩膀、腹部。
  • allowExperience 对应让声音、身体感觉和念头自然出现。
  • returnToBreath 对应发现走神后回到呼吸。

这段代码适合放在 SwiftUI 的引导页、watchOS 的短练习,或音频课程的字幕提示中。

3. 把「走神」当成练习事件

20:25

Jeff 说走神很自然。Dan 后面补充,冥想的核心动作是反复发现自己分心,然后重新开始。用户如果以为正确冥想等于清空头脑,很容易在第一天放弃。

App 可以把「发现走神」做成正向事件。用户点一下按钮,记录一次回来,而非记录一次失败。

struct DistractionEvent {
    let occurredAt: Date
    let returnedToAnchor: Bool
}

struct MeditationSession {
    private(set) var distractions: [DistractionEvent] = []

    mutating func recordReturn(at date: Date = Date()) {
        let event = DistractionEvent(
            occurredAt: date,
            returnedToAnchor: true
        )
        distractions.append(event)
    }
}

关键点:

  • DistractionEvent 记录一次分心后的回归。
  • returnedToAnchor 表示用户已经回到注意对象,比如呼吸。
  • MeditationSession 保存一次练习中的所有回归事件。
  • recordReturn 只在用户完成「发现并回来」时追加记录。
  • 这里没有失败计数,因为 transcript 强调走神是练习的一部分。

界面可以把按钮写成「我回来了」。用户按下后,App 显示「这就是一次练习」。这比显示「分心次数 +1」更贴近 session 的指导。

4. 用暂停检查管理屏幕压力

26:22

Dan 问 Jeff 如何处理和技术的紧张关系。Jeff 的做法是工作中停一下,检查自己现在的状态,伸展,散步,再回来。他还会限制每天屏幕时间。

这可以转成一个简单的检查列表。它适合放在菜单栏 App、番茄钟、Apple Watch 提醒,或开发者工具插件里。

struct NervousSystemCheck {
    var bodyTension: Int
    var attentionStuck: Bool
    var needsWalk: Bool

    var suggestedAction: String {
        if needsWalk {
            return "离开屏幕,走几分钟。"
        }

        if bodyTension >= 7 {
            return "暂停一分钟,放松肩膀和腹部。"
        }

        if attentionStuck {
            return "做三次深呼吸,再决定下一步。"
        }

        return "继续工作,下一次休息时再检查。"
    }
}

关键点:

  • bodyTension 记录身体紧张程度,对应 Jeff 说的检查自身状态。
  • attentionStuck 表示注意力被单一对象卡住。
  • needsWalk 对应 Jeff 提到的散步。
  • suggestedAction 根据状态给出一个具体动作。
  • 返回值都很短,适合通知、Complication 或小组件。

这个功能的重点是时机。提醒不应该打断用户的每次专注。它更适合在长时间屏幕使用、会议结束、编译失败多次之后出现。

5. 把幸福感看成可训练状态

27:48

Dan 最后的结论是:平静、快乐、连接、同情和爱都可以训练,冥想是其中一种方式。对健康 App 来说,这意味着目标不只是一条完成记录,还包括用户练习后的状态变化。

可以在每次练习结束后做一个轻量记录。

struct PostMeditationReflection {
    let settled: Bool
    let present: Bool
    let note: String?

    var summary: String {
        switch (settled, present) {
        case (true, true):
            return "更稳定,也更在场。"
        case (true, false):
            return "身体更稳定。"
        case (false, true):
            return "注意力更在场。"
        case (false, false):
            return "已经完成一次练习。"
        }
    }
}

关键点:

  • settled 对应 Jeff 在结束前问的「是否更 settled」。
  • present 对应「是否更 present」。
  • note 给用户保留自由记录空间。
  • summary 用二元状态生成短反馈。
  • 即使两个值都是 false,反馈仍承认用户完成了练习。

这个设计避免把冥想做成绩效考核。用户只需要观察变化,下一次继续。

核心启发

  1. 做什么:做一个一分钟冥想入口,放在 App 首页或 Apple Watch Complication。

    • 为什么值得做:Dan 明确说 one minute counts,低门槛有助于习惯形成。
    • 怎么开始:用 DailyIshHabit 记录 31 天内的练习天数,首页只提供「开始 1 分钟」按钮。
  2. 做什么:做一个「我回来了」按钮,记录用户走神后重新回到呼吸的次数。

    • 为什么值得做:Jeff 和 Dan 都强调走神后回来就是练习动作。
    • 怎么开始:用 MeditationSession.recordReturn() 追加事件,结束页展示「你回来了 6 次」。
  3. 做什么:做一个屏幕压力暂停提醒。

    • 为什么值得做:Jeff 提到技术使用要靠暂停、伸展、散步来恢复平衡。
    • 怎么开始:在长时间专注后弹出 NervousSystemCheck 问答,给出一分钟放松或散步建议。
  4. 做什么:做一个社交焦虑准备卡片。

    • 为什么值得做:Jeff 建议先识别具体焦虑,再和相关的人沟通协议。
    • 怎么开始:让用户写下「担心什么」「希望对方怎么配合」,保存成可复制的短消息。
  5. 做什么:做一个练习后的状态记录。

    • 为什么值得做:Jeff 在练习结束时要求观察是否更稳定、更在场。
    • 怎么开始:用 PostMeditationReflection 保存两个布尔值和一条短笔记,按周展示变化。

关联 Session

评论

GitHub Issues · utterances