ActivityKit — 基础概念
This article is extracted from the chat log with AI. Please identify it with caution.

苹果的 ActivityKit 是 iOS 16.1 及更高版本中引入的框架,用于支持 实时活动(Live Activity) 功能。它允许开发者在锁定屏幕和灵动岛(仅限 iPhone 14 Pro 及以上机型)中展示应用程序的实时动态数据,例如外卖订单进度、体育比赛比分或网约车位置更新。以下是其基础概念和核心功能的详细介绍:


一、ActivityKit 的核心概念 #

  1. 实时活动(Live Activity)

    • 定义:一种交互式通知形式,能够在锁定屏幕或灵动岛上持续显示动态更新的信息,用户无需解锁设备即可实时跟踪关键状态。
    • 生命周期:由 ActivityKit 管理,开发者可通过代码启动、更新或终止实时活动。若用户未主动移除,系统将在 灵动岛保留最多 8 小时锁定屏幕保留最多 12 小时 后自动移除。
  2. ActivityAttributes 协议

    • 作用:定义实时活动的数据模型,包括 静态数据(如订单号、商品数量)和 动态数据(如司机姓名、倒计时)。
    • 示例
      struct PizzaDeliveryAttributes: ActivityAttributes {
          public struct ContentState: Codable, Hashable {
              var driverName: String
              var deliveryTimer: ClosedRange<Date>
          }
          var numberOfPizzas: Int
          var totalAmount: String
      }
      
  3. ActivityConfiguration

    • 功能:配置实时活动的界面,需为锁定屏幕和灵动岛分别提供 SwiftUI 视图。灵动岛需支持多种显示模式(如紧凑视图、扩展视图等)。
    • 代码结构
      ActivityConfiguration(for: PizzaDeliveryAttributes.self) { context in
          LockScreenView(context: context) // 锁定屏幕视图
      } dynamicIsland: { context in
          DynamicIslandView(context: context) // 灵动岛视图
      }
      

二、开发流程与关键步骤 #

  1. 环境要求

    • 系统版本:iOS 16.1+,需使用 Xcode 14.1 及以上版本。
    • 权限配置:在 Info.plist 中添加 NSSupportsLiveActivities 并设为 YES
  2. 实现步骤

    • 创建 Widget Extension:需勾选 “Include Live Activity” 选项,并在 WidgetBundle 中集成实时活动组件。
    • 数据更新
      • 本地更新:通过 ActivityKit 的 API 直接修改 ContentState
      • 远程推送:通过 APNs 发送最多 4KB 的数据 更新实时活动,需处理推送令牌(pushToken)的获取与过期问题。
  3. 界面设计

    • 锁定屏幕:需确保视图高度不超过 160px,以避免被系统截断。
    • 灵动岛:需适配多种显示模式:
      • 紧凑视图(Compact):单活动时的默认样式。
      • 最小视图(Minimal):多活动时的圆形图标。
      • 扩展视图(Expanded):用户点击灵动岛后的展开详情。

三、限制与注意事项 #

  1. 功能限制

    • 无网络访问:实时活动运行在沙盒中,无法直接访问网络或定位服务。
    • 交互限制:界面中不能包含按钮等交互元素,用户点击会直接跳转至主应用。
  2. 数据限制

    • 每次更新的动态数据(ContentState)大小不得超过 4KB,静态数据(Attributes)无此限制。
  3. 权限管理

    • 用户需在首次启动时授权通知权限,后续可在系统设置中单独关闭实时活动。

四、典型应用场景 #

  • 外卖配送:显示骑手位置、预计送达时间。
  • 体育赛事:实时更新比分和比赛进程。
  • 交通出行:网约车距离、航班状态。

五、常见问题与解决方案 #

  • 推送令牌问题:启动实时活动后 pushToken 可能为 nil,需通过 pushTokenUpdates 异步获取。令牌可能过期,需后端及时更新。
  • 兼容性:需为不支持灵动岛的设备提供锁定屏幕的横幅视图。

通过 ActivityKit,开发者可以为用户提供更直观的实时信息展示,但需严格遵循其设计规范和数据限制。具体实现可参考苹果官方文档及示例代码。

本文共 1176 字,创建于 May 20, 2020
相关标签: ByAI, Xcode, DeepSeek