HealthKit|心率与静息心率 在 HealthKit(iOS) 中,与心率(Heart Rate)相关的数据并非单一指标,而是一组彼此关联、可供开发者获取的健康数据类型,主要包括: * 基础心率 * 静息心率 * 步行平均心率 * 心率变异性(HRV) * 以及高心率、低心率和心律不齐等心率异常事件 心率与静息心率 心率异常与系统事件 常见问题 获取心率数据是否对性能有影响? 不会。HealthKit 查询在后台线程进行,不阻塞主线程,并且有内部缓存机制。
ActivityKit|通过 activityBackgroundTint 设置实时活动卡片背景色调 修改实时活动锁屏卡片的背景,有两种方式: * .activityBackgroundTint() * .containerBackground(for: .widget) 使用 activityBackgroundTint 设置背景色调 设置 Liquid Glass 玻璃效果() 如果要设置 iOS 26 系统默认的液态玻璃效果,只需添加 .activityBackgroundTint(.clear) 即可。 如果不添加这个修饰器并指定 .clear,默认会显示为偏蓝色的背景色,原因未知: 建议在子组件内部设置,例如 PickupActivityLockScreenView 组件内部最外层的 VStack 上设置,在这里统一设置 .activityBackgroundTint(.clear) 或 .background,更加统一。 下面这个 Reddit 帖子中也有讨论这个修饰器: Liquid Glass live activity widget. How? by u/Nilsolivier in
ActivityKit|在 ViewModel 中统一管理灵动岛启动 问题场景说明 在取件喵 App 中,创建了一个 LiveActivityManager.shared.startPickupActivity() 方法用于启动灵动岛通知。 在项目中,我在两处分别调用了这个方法: 1. 在 PickupViewMode 的 addPickup 方法中,如果添加取件码成功,则调用 startPickupActivity() 方法。 2. 在 AnalyzeImageIntent 这个 Intent 中,我再次根据添加结果调用了 startPickupActivity() 方法。 这不仅导致重复的代码逻辑,而且在 AnalyzeImageIntent 中会启动两次灵动岛,导致灵动岛时不时出现异常。 最佳实践 在主 App 的 ViewModel 中统一管理灵动岛的启用逻辑,addPickup() 方法现在统一处理 Live Activity 启动。 在 Intent 中直接调用 ViewModel
AppIntent|可以直接调用主 App 中的 ViewModel 方法 一个常见的错误(包括主流 AI 工具)是:Intent 运行独立的 Extension 进程,无法访问主 App 中定义的方法—— 这是错误的。 早期的 SiriKit Intents(iOS 16+)确实是这样,但从 iOS17 开始,新的 SiriKit Intents 运行在主 App 进程内,因此可以直接访问 App 数据,可以访问 ViewModel 单例。 App Intent 能力边界 对于 iOS 17 中新添加的 AppIntent,是这样的: 1. 默认运行在主 App 中,可以直接通过快捷指令或者 Live Activity
ActivityKit|灵动岛中的图片资源限制 在灵动岛和 Widget 中,对 Assets 资源有一些限制。如果不满足条件,可能无法显示。 资源大小限制 根据官方文档信息,图片必须小于或等于 4kb,才能在实时互动中显示。 但在实践中,我发现即使 PNG 文件达到 117KB 大小,也可以显示。不确定这个限制是否仅对灵动岛 Minimal 和 Compact 模式下生效? PDF 格式测试 使用一张 Figma 导出的 PDF 格式文件测试 * 97KB,无法显示 * 20KB,使用在线工具压缩,仍然无法显示 注意:由于 PDF 是矢量图,在 Figma 中即使使用 Scale 将尺寸调整为 0.25x,导出文件大小也不会变化。 💡使用这个工具来压缩:
ActivityKit|为灵动岛添加操作按钮 在灵动岛中,支持通过 Button(:intent) 的方式添加可交互的按钮。按钮只能通过 LiveActivityIntent 来执行功能。 常见问题 灵动岛按钮无法执行 AppIntent 在取件喵 App 中,在 Live Activity 视图里点击“我已取餐”按钮无任何反应,Xcode 也没有输出,灵动岛状态不会更新。 原因是 Live Activity 的按钮需要绑定 LiveActivityIntent 才能被系统执行。原实现使用的是 `AppIntent`,导致按钮点击后不会触发执行逻辑。