iOS

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`,导致按钮点击后不会触发执行逻辑。
廖林