廖林

廖林

macOS 原生应用的窗口与导航管理

SwiftUI 提供了 NavigationSplitView、NavigationStack、TabView 等多种导航容器,它们在 macOS、iPadOS 和 iOS 上的行为各有不同,组合方式也不止一种。 这篇文章整理了我在实际开发中对 macOS 原生应用导航管理的观察与总结,希望能帮助你在项目初期做出更清晰的架构选择。 创建三列应用 NavigationSplitView 是天然首选 如果你的应用始终需要三列结构——比如 Notes 的「文件夹 → 笔记列表 → 编辑器」,或 Mail 的「邮箱 → 邮件列表 → 邮件正文」——那么 NavigationSplitView 的三列形态就是最自然的方案: NavigationSplitView { // sidebar } content: { // 中间列 } detail: { // 详情列 } 在这种场景下,系统的原生体验非常稳定,toolbar、标题栏与分栏折叠行为都与系统预期一致,几乎不需要额外干预。 混合列数场景:谨慎切换容器形态 实际项目中更常见的情况是:
廖林

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,导出文件大小也不会变化。 💡使用这个工具来压缩: