增强你的日记应用建议能力
Enhanced suggestions for your journaling app
2024年6月10日
一句话判断
iOS 18 的 Journaling Suggestions API 新增了心理健康状态(State of Mind)、跑步运动记录、非 Apple 应用的媒体播放和反思提示(Reflection Prompts)四类数据源,你的日记应用可以获得更丰富的用户生活上下文。
这场 Session 讲了什么
Journaling Suggestions API 帮助用户反思生活。iOS 能感知用户生活中的重要事件——拍的照片、锻炼记录、去过的地方——然后作为日记写作的起点建议给用户。这个 API 在推出几个月内就获得了大量应用采纳。
iOS 18 带来了多项增强。首先是完整的横屏支持——选择器会自动跟随应用的方向设置,内容预览界面也利用了更宽的屏幕空间来展示更大的资产。
核心更新在四类新的资产类型。State of Mind(心理状态)让日记应用获取用户在 Health 中记录的情绪数据,包括瞬时情绪和每日心情,附带效价(Valence)、标签(Labels)和关联因素(Associations)。Motion Activity 新增了跑步和混合走路/跑步两种运动类型,覆盖没有 Apple Watch 但经常运动的用户。Generic Media 支持用户在非 Apple 应用中听的音乐和播客。Reflection Prompts 是之前只在 Apple Journal 中提供的反思提示,现在对所有开发者开放。
值得深挖的点
State of Mind 集成的隐私和体验设计
State of Mind 是 Health 在 iOS 17 引入的功能,让用户记录自己的情绪状态。研究显示,表达性写作(expressive writing)对心理健康有积极影响——无论是面对负面情绪还是品味正面情绪。
技术层面,State of Mind 资产类型是 JournalingSuggestion.StateOfMind,包含一个完整的 HKStateOfMind 样本:Valence 表示情绪在正面到负面轴上的位置,Labels 描述具体感受(如平静、满足、焦虑),Associations 描述可能的触发因素(如家庭、工作、健身)。资产还附带图片 URL、明暗模式配色和时间戳。
用户体验层面有一个重要细节:老用户升级到 iOS 18 后会在建议面板看到一个提示,引导他们开启 State of Mind 内容分享。新用户则可以在 onboarding 中开启。开发者不需要做额外引导,系统已经处理好了。所有情绪状态都值得记录——不论效价高低,这也是为什么 API 不会对数据进行任何过滤或评判。
Reflection Prompts 的开放
Reflection Prompts 是一类特殊的建议——它不是基于用户活动的数据,而是一个开放性的写作提示,比如”今天什么让你微笑?“或”你最近有什么新的发现?“。之前这只在 Apple 自家的 Journal 应用中可用,iOS 18 向所有第三方日记应用开放了。
这是一个重要的信号:Apple 在逐步把 Journal 应用的差异化能力通过 API 开放出来。对于日记应用开发者来说,Reflection Prompts 提供了一种不需要用户活动数据就能激发写作的方式,降低了用户开始写日记的门槛。
代码片段
处理 State of Mind 资产
// 从建议中获取 State of Mind 内容
func handleStateOfMind(from suggestion: JournalingSuggestion) {
// 检索所有 State of Mind 类型的资产
let stateOfMindItems = suggestion.content.compactMap { item in
item as? JournalingSuggestion.StateOfMind
}
for item in stateOfMindItems {
// HKStateOfMind 样本包含完整的情绪数据
let sample = item.stateOfMind
let valence = sample.valence // 情绪效价
let labels = sample.labels // 情绪标签
let associations = sample.associations // 关联因素
// 显示图标
// AsyncImage(url: item.iconURL)
// 用效价生成简单的表情符号
let emoji = getEmotionEmoji(valence: valence)
print("今日心情: \(emoji)")
}
}
// 根据效价生成表情符号
func getEmotionEmoji(valence: Double) -> String {
if valence > 0.3 {
return "😊" // 积极
} else if valence < -0.3 {
return "😔" // 消极
} else {
return "😐" // 中性
}
}
坑点:State of Mind 数据需要用户在 Health 应用中主动记录过才能出现在建议中。如果用户从未使用过这个功能,你的应用不会收到任何 State of Mind 建议。
处理 Motion Activity 的新运动类型
// iOS 18 新增跑步和混合运动类型
func handleMotionActivity(from suggestion: JournalingSuggestion) {
let motionItems = suggestion.content.compactMap { item in
item as? JournalingSuggestion.MotionActivity
}
for item in motionItems {
let movementType = item.movementType
let label = getMotionActivityLabel(type: movementType)
// 步数 + 运动类型 + 图标 + 时间戳
print("运动记录: \(label), 步数: \(item.stepCount)")
// AsyncImage(url: item.iconURL)
}
}
// 解析新的运动类型
func getMotionActivityLabel(type: MovementType) -> String {
switch type {
case .walking:
return "步行"
case .running:
return "跑步"
case .walkingAndRunning:
return "走跑混合"
@unknown default:
return "运动"
}
}
横屏支持(无需额外代码)
// iOS 18 中 Journaling Suggestions 选择器自动支持横屏
// 只需要确保你的应用支持横屏方向即可
// 在 Info.plist 或项目设置中:
// Supported interface orientations 包含 Landscape left/right
// 选择器会自动跟随应用方向
// 内容预览界面会利用更宽的空间展示更大的资产
// 无需额外适配代码
最佳实践
如果你的日记应用已经集成了 Journaling Suggestions API,iOS 18 的升级几乎不需要改代码——横屏支持自动生效,新的资产类型作为 suggestion.content 中的新类型出现,用 compactMap 检查即可。建议优先接入 State of Mind,它与日记写作的核心场景高度契合。Motion Activity 的跑步类型覆盖了没有 Apple Watch 的运动用户群,值得支持。Reflection Prompts 的接入门槛最低,能立即提升应用的写作引导体验。处理这些数据时记住:所有情绪都是合法的记录对象,不要在你的 UI 中对效价做任何评判性展示。
还有什么值得关注
- Generic Media 资产让用户可以记录在第三方 App 中听到的音乐和播客
- Reflection Prompts 之前是 Apple Journal 的独有功能,开放给所有开发者是重要的平台策略变化
- 建议相关的隐私控制和用户开关在 Journaling Suggestions Settings 中管理,开发者应熟悉这些开关的位置