WWDC Quick Look 💓 By SwiftGGTeam
Add support for Matter in your smart home app

Add support for Matter in your smart home app

观看原视频

Highlight

Apple 在 iOS、iPadOS 和 tvOS 15 developer preview 中把 Matter 接入 HomeKit,并提供新的 setup API 与 CHIP.framework,让智能家居 App 可以配置、配对和控制 Matter 配件。

核心内容

智能家居 App 过去要面对一个现实问题:同一个家庭里可能有不同厂商的灯、插座、传感器和中控。每个厂商维护自己的协议,App 开发者也要为连接、配对、状态读取和远程控制写很多专有逻辑。

Matter(智能家居连接标准)想解决这件事。它由 Apple 和其他行业厂商共同开发,目标是让智能家居配件用统一协议协作。演讲里提到,Matter 的早期名称是 Connected Home over IP,简称 CHIP,所以示例 API 里仍然会看到 CHIP 命名。

Apple 的做法有两层。

第一层是 HomeKit。iOS 15 developer preview 中,HomeKit 会把 Matter 当作并行协议接入。已有 HomeKit App 继续调用原来的 API,二维码扫描器开始识别 Matter QR code,状态读取、写入、通知、远程访问、场景和自动化也沿用 HomeKit 的模型。

第二层是新 setup API。某些 App 需要把 Matter 配件连接到自己的智能家居 hub。Apple 提供系统 UI、拓扑对象和 App Extension(应用扩展)回调。App 告诉系统自己管理哪些 home 和 room,系统负责扫描、页面流转和错误处理,扩展负责用 CHIP.framework 完成配对和配置。

通过 HomeKit 接入 Matter

HomeKit 的价值是屏蔽底层协议。用户用同一个流程添加配件,App 用同一组 API 管理配件。开发者不需要先判断这是 HAP 设备还是 Matter 设备。

这解决了最常见的接入成本:已有 HomeKit App 不需要重写配件添加入口。用户扫 Matter QR code,系统用熟悉的 HomeKit 设置流程继续往下走。

通过 setup API 接入自有 hub

如果你的 App 管理自己的 home hub,就要告诉系统这个 App 管理哪些家和房间。系统 UI 会显示这些选择。用户选完后,iOS 调用扩展里的 HMCHIPServiceRequestHandler 子类,让扩展完成三件事:配对配件、返回房间列表、配置名称和房间。

这样,App 保留自己的拓扑和 hub 逻辑,同时获得 Apple 的系统级配件添加体验。

用 CHIP.framework 控制配件

Matter 的数据模型由 endpoint、cluster、attribute 和 action 组成。一个灯可能有一个 endpoint 表示灯本身,里面有 on-off cluster,cluster 里有表示开关状态的 attribute。CHIP.framework 把这些概念暴露成代码接口。

开发者拿到已配对设备后,可以创建 cluster 对象,然后执行 toggle、read attribute 这类操作。演讲用灯泡开关做例子,展示了从设备 ID 到读取状态的完整路径。

详细内容

1. 现有 HomeKit API 开始识别 Matter QR code

04:58

Apple 在演讲中先展示了已有 HomeKit 添加配件入口。iOS 15 developer preview 中,这个入口调用的二维码扫描器会识别 HAP QR code,也会识别 Matter QR code。

home.addAndSetupAccessories() { error in
    if let error = error {
         print("Error occurred in accessory setup \(error)")
    } else {
         print("Successfully added accessory to HomeKit")
    }
}

关键点:

  • home.addAndSetupAccessories() 启动 HomeKit 的系统添加流程。
  • 闭包里的 error 表示添加流程是否失败。
  • if let error = error 处理扫码、配对或设置过程中的错误。
  • else 分支表示配件已经成功加入 HomeKit。
  • iOS 15 developer preview 中,同一个扫描流程会开始识别 Matter QR code。

这段代码的重点在于“无需新增入口”。已有 HomeKit App 如果已经用这个 API 添加 HAP 配件,就能用相同入口开始测试 Matter 配件。

2. 用拓扑对象启动 Matter setup API

09:12

当 App 需要把 Matter 配件连接到自己的 home hub 时,要先把 App 管理的 home 列表交给系统。系统根据这个 topology(拓扑)显示选择页面。

let homes = proprietaryHomeStorage.homes.map { home in
    HMCHIPServiceHome(uuid: home.uuid, name: home.name)
}

let topology = HMCHIPServiceTopology(homes: homes)
let setupManager = HMAccessorySetupManager()

do {
    try await setupManager.addAndSetUpAccessories(for: topology)
    print("Successfully added accessory to my app")
} catch {
    print("Error occurred in accessory setup \(error)")
}

关键点:

  • proprietaryHomeStorage.homes 是 App 自己保存的家庭列表。
  • map 把自有 home 转成 HMCHIPServiceHome,保留 uuidname
  • HMCHIPServiceTopology(homes:) 描述这个 App 能管理的 home 集合。
  • HMAccessorySetupManager() 创建系统配件设置管理器。
  • try await setupManager.addAndSetUpAccessories(for:) 启动 Matter 配件添加流程,并使用 Swift async/await(异步等待)处理结果。
  • catch 捕获设置流程中的错误。

演讲提到,如果 topology 只有一个 home,系统会跳过 home 选择卡片,因为用户意图已经明确。如果有多个 home,系统会让用户选择具体添加到哪一个 home。

3. 扩展负责配对、房间列表和配置

11:27

setup API 的系统 UI 负责扫描和页面流转。真正的配对和配置由 App Extension 完成。扩展需要继承 HMCHIPServiceRequestHandler,并重写三个方法。

class RequestHandler: HMCHIPServiceRequestHandler, CHIPDevicePairingDelegate {

    override func rooms(in: HMCHIPServiceHome) async throws -> [HMCHIPServiceRoom] {
        // iOS is querying for rooms that match the given home.  These rooms will be shown in system UI and the selection will be vended back to your extension's `configureAccessory` function
   }

    override func pairAccessory(in: HMCHIPServiceHome, onboardingPayload: String) async throws -> Void {
        // iOS is instructing the extension to pair the accessory via CHIP.framework
   }

    override func configureAccessory(named accessoryName: String, room accessoryRoom: HMCHIPServiceRoom) async throws -> Void {
       // iOS is instructing the extension to apply configuration via CHIP.framework.
    }
}

关键点:

  • RequestHandler 是扩展的主要请求处理类。
  • HMCHIPServiceRequestHandler 接收 iOS 发来的 setup 请求。
  • CHIPDevicePairingDelegate 用于参与 CHIP.framework 的配对流程。
  • rooms(in:) 返回指定 home 下的房间列表,系统 UI 会把这些房间展示给用户。
  • pairAccessory(in:onboardingPayload:) 接收扫描得到的 Matter onboarding payload,并通过 CHIP.framework 建立安全配对。
  • configureAccessory(named:room:) 接收用户输入的配件名称和房间,并通过 CHIP.framework 写入配置。

演讲明确说,开发者实现这三个方法后,UI 展示、步骤切换和错误处理由系统处理。这让 App 能把代码集中在自己的 home hub 和 Matter 配对逻辑上。

4. 理解 Matter 数据模型

12:29

Matter 配件通过数据模型暴露能力。演讲按四层解释:endpoint(端点)、cluster(能力集合)、attribute(状态值)和 action(动作)。

// Matter data model used in the session:
// Accessory
// └── Endpoint: lightEndpoint
//     └── Cluster: CHIPOnOff
//         └── Attribute: OnOff
//             ├── Action: toggle
//             └── Action: readAttributeOnOff

关键点:

  • Endpoint 表示配件中可单独寻址的逻辑功能,例如信息 endpoint 或灯 endpoint。
  • Cluster 表示 endpoint 的某项能力,例如亮度、颜色或电源控制。
  • Attribute 表示配件状态,例如灯的开关状态。
  • Action 表示 attribute 支持的操作,例如读取、写入和上报。
  • 演讲把 cluster 类比为 HomeKit service,把 attribute 类比为 HomeKit characteristic。

这段结构帮助理解后面的控制代码。你先找到设备,再定位 endpoint,再创建 cluster,最后对 attribute 发起操作。

5. 用 CHIP.framework 控制灯的开关状态

14:27

Apple 展示了如何通过 CHIP.framework 与灯配件交互。代码从共享 controller 开始,拿到已配对设备,然后创建 on-off cluster,最后执行 toggle 和读取状态。

let controller = CHIPDeviceController.shared()
do {
    let device = try controller.getPairedDevice(accessoryDeviceID)
    let onOffCluster = CHIPOnOff(device: device,
                               endpoint: lightEndpoint,
                                  queue: DispatchQueue.main)
    onOffCluster?.toggle({ (error, values) in
        // Error handling code here
    })
    onOffCluster?.readAttributeOnOff(responseHandler: { error, response in
        if let state = response?[VALUE_KEY] as? NSInteger {
           updateLightState(state: state)
        }
    })
} catch {
    print("Error occurred in accessory control \(error)")
}

关键点:

  • CHIPDeviceController.shared() 获取 CHIP.framework 的共享 controller。
  • controller.getPairedDevice(accessoryDeviceID) 用配对时分配的设备 ID 获取配件句柄。
  • CHIPOnOff(device:endpoint:queue:) 为指定灯 endpoint 创建 on-off cluster 句柄。
  • DispatchQueue.main 指定回调队列,示例里用于更新应用界面状态。
  • onOffCluster?.toggle 请求切换 on-off attribute 的状态。
  • readAttributeOnOff 请求读取 on-off attribute 当前状态。
  • response?[VALUE_KEY] as? NSInteger 从响应字典取出状态值。
  • updateLightState(state:) 用读取结果更新 App 内部状态或界面。
  • catch 处理获取已配对设备失败等控制错误。

这段代码对应 Matter 数据模型的实际使用:设备 ID 定位 accessory,endpoint 定位灯,cluster 定位电源控制能力,attribute 操作完成状态读取和控制。

6. 管理多个 connected admins

15:29

Matter 允许多个 admin 同时连接同一个配件。Home app 因此新增 Connected Services(已连接服务)区域,让用户查看一个配件当前连接了哪些 admin,并重新开启配对模式,让新的 admin 接入。

// Home app management model described in the session:
// 1. Show connected admins under Connected Services.
// 2. Let users manage connected admins.
// 3. Let users turn on pairing mode again.

关键点:

  • Connected Services 是 Home app 中展示 connected admins 的区域。
  • 多 admin 让用户可以把同一个 Matter 配件连接到多个生态或 hub。
  • 重新开启 pairing mode 后,新的 admin 可以连接到同一个配件。
  • 这部分能力由 Home app 展示,演讲没有给出第三方 API 代码。

这一点对 App 设计很重要。配件可能被多个系统管理,App 的状态页面应该能接受“同一个设备还有其他管理方”的现实。

核心启发

  1. 做什么:给已有 HomeKit App 增加 Matter 配件添加入口。 为什么值得做addAndSetupAccessories() 在 iOS 15 developer preview 中会开始识别 Matter QR code。 怎么开始:检查 App 中现有的 HomeKit 添加流程,确认它调用 home.addAndSetupAccessories(),再用 developer profile 和 Matter developer preview 环境测试扫码。

  2. 做什么:为自有智能家居 hub 做系统级 Matter 配件设置流程。 为什么值得做HMAccessorySetupManager 可以使用系统 UI 扫码和选择 home,扩展只处理业务逻辑。 怎么开始:把自有 home 转成 HMCHIPServiceHome,创建 HMCHIPServiceTopology,调用 addAndSetUpAccessories(for:),再实现 HMCHIPServiceRequestHandler 扩展。

  3. 做什么:做一个 Matter 灯泡控制页。 为什么值得做:CHIP.framework 暴露了 controller、device、cluster 和 attribute 操作路径。 怎么开始:用 CHIPDeviceController.shared() 取得 controller,用 getPairedDevice 获取设备,再通过 CHIPOnOff 执行 togglereadAttributeOnOff

  4. 做什么:在设备详情页展示配件的房间和配置状态。 为什么值得做:setup API 会把用户选择的 HMCHIPServiceRoom 和配件名称交给扩展。 怎么开始:在 configureAccessory(named:room:) 中把名称、房间和配件 ID 写入 App 自己的存储,设备详情页读取这份数据。

  5. 做什么:给用户提示“这个配件可能还有其他管理方”。 为什么值得做:Matter 支持 multiple admins,Home app 会展示 Connected Services。 怎么开始:在设备管理页设计 connected services 区域,说明配件可被多个 admin 管理;具体可用 API 以 Apple 后续文档和 Matter open source API 为准。

关联 Session

评论

GitHub Issues · utterances