苹果的 ActivityKit 是 iOS 16.1 及更高版本中引入的框架,用于支持 实时活动(Live Activity) 功能。它允许开发者在锁定屏幕和灵动岛(仅限 iPhone 14 Pro 及以上机型)中展示应用程序的实时动态数据,例如外卖订单进度、体育比赛比分或网约车位置更新。以下是其基础概念和核心功能的详细介绍:
一、ActivityKit 的核心概念 #
实时活动(Live Activity)
- 定义:一种交互式通知形式,能够在锁定屏幕或灵动岛上持续显示动态更新的信息,用户无需解锁设备即可实时跟踪关键状态。
- 生命周期:由 ActivityKit 管理,开发者可通过代码启动、更新或终止实时活动。若用户未主动移除,系统将在 灵动岛保留最多 8 小时,锁定屏幕保留最多 12 小时 后自动移除。
ActivityAttributes 协议
- 作用:定义实时活动的数据模型,包括 静态数据(如订单号、商品数量)和 动态数据(如司机姓名、倒计时)。
- 示例:
struct PizzaDeliveryAttributes: ActivityAttributes { public struct ContentState: Codable, Hashable { var driverName: String var deliveryTimer: ClosedRange<Date> } var numberOfPizzas: Int var totalAmount: String }
ActivityConfiguration
- 功能:配置实时活动的界面,需为锁定屏幕和灵动岛分别提供 SwiftUI 视图。灵动岛需支持多种显示模式(如紧凑视图、扩展视图等)。
- 代码结构:
ActivityConfiguration(for: PizzaDeliveryAttributes.self) { context in LockScreenView(context: context) // 锁定屏幕视图 } dynamicIsland: { context in DynamicIslandView(context: context) // 灵动岛视图 }
二、开发流程与关键步骤 #
环境要求
- 系统版本:iOS 16.1+,需使用 Xcode 14.1 及以上版本。
- 权限配置:在
Info.plist
中添加NSSupportsLiveActivities
并设为YES
。
实现步骤
- 创建 Widget Extension:需勾选 “Include Live Activity” 选项,并在
WidgetBundle
中集成实时活动组件。 - 数据更新:
- 本地更新:通过
ActivityKit
的 API 直接修改ContentState
。 - 远程推送:通过 APNs 发送最多 4KB 的数据 更新实时活动,需处理推送令牌(
pushToken
)的获取与过期问题。
- 本地更新:通过
- 创建 Widget Extension:需勾选 “Include Live Activity” 选项,并在
界面设计
- 锁定屏幕:需确保视图高度不超过 160px,以避免被系统截断。
- 灵动岛:需适配多种显示模式:
- 紧凑视图(Compact):单活动时的默认样式。
- 最小视图(Minimal):多活动时的圆形图标。
- 扩展视图(Expanded):用户点击灵动岛后的展开详情。
三、限制与注意事项 #
功能限制
- 无网络访问:实时活动运行在沙盒中,无法直接访问网络或定位服务。
- 交互限制:界面中不能包含按钮等交互元素,用户点击会直接跳转至主应用。
数据限制
- 每次更新的动态数据(
ContentState
)大小不得超过 4KB,静态数据(Attributes
)无此限制。
- 每次更新的动态数据(
权限管理
- 用户需在首次启动时授权通知权限,后续可在系统设置中单独关闭实时活动。
四、典型应用场景 #
- 外卖配送:显示骑手位置、预计送达时间。
- 体育赛事:实时更新比分和比赛进程。
- 交通出行:网约车距离、航班状态。
五、常见问题与解决方案 #
- 推送令牌问题:启动实时活动后
pushToken
可能为nil
,需通过pushTokenUpdates
异步获取。令牌可能过期,需后端及时更新。 - 兼容性:需为不支持灵动岛的设备提供锁定屏幕的横幅视图。
通过 ActivityKit,开发者可以为用户提供更直观的实时信息展示,但需严格遵循其设计规范和数据限制。具体实现可参考苹果官方文档及示例代码。