iOS Matter SDK

基于 Apple 系统框架的 Matter 开发指南,覆盖 MatterSupport 扩展和 Cluster 控制。

Matter 1.4+iOS 16.1+成熟

概述

iOS 的 Matter 支持内建于系统框架中,开发者使用两个核心框架:Matter.framework(底层协议栈,提供 Cluster 级控制)和 MatterSupport(高层配网扩展,让第三方 App 参与 Apple Home 的配网流程)。

Matter.framework 从 iOS 16.0 开始提供,目前已进入第 4 个 OS 周期,Cluster API 持续扩充。MatterSupport 从 iOS 16.1 开始可用,是第三方 App 接入 Matter 生态的推荐方式。

框架选择

iOS 上 Matter 开发涉及三个框架,各自定位不同:

框架定位适用场景最低版本
MatterSupport高层配网扩展第三方 App 参与 Apple Home 配网流程iOS 16.1
Matter.framework底层协议栈直接 Cluster 控制、独立 Fabric 管理iOS 16.0
HomeKitApple Home 桥接获取已入网设备的 matterNodeID 后用 Matter.framework 控制iOS 16.1

配网流程

第三方 App 通过实现 MatterSupport Extension 参与系统配网流程。系统处理 BLE 发现和 PASE 会话,你的扩展在关键节点介入。

1App 创建 MatterAddDeviceRequest 并调用 perform()
2系统弹出配网 UI,扫描 QR 码或手动输入
3系统通过 BLE 发现设备,建立 PASE 会话
4你的扩展收到 validateDeviceCredential 回调
5你的扩展选择 WiFi 或 Thread 网络
6你的扩展在 commissionDevice 中配网到自有 Fabric
7你的扩展在 configureDevice 中保存设备配置

设备控制

iOS 提供两种 Cluster API 模式:Stateless(MTRBaseCluster,直接网络操作)和 Stateful(MTRCluster,带本地缓存的订阅模式)。

swift开关控制示例
import Matter

// 创建 Stateless 设备代理
let device = MTRBaseDevice(nodeID: nodeID, controller: controller)
let onOff = MTRBaseClusterOnOff(
    device: device,
    endpointID: NSNumber(value: 1),
    queue: .main
)

// 切换开关状态
try await onOff.toggle()

// 读取当前状态
let isOn = try await onOff.readAttributeOnOff()

读取设备类型与能力

用 MTRBaseClusterDescriptor 读 Descriptor(0x001D)拿到端点、设备类型和 Cluster 列表;也可以用 readAttributes 做通配读取,一次拿回全部原始属性。字段含义见 概念总览 · 配网后怎么读出设备能力,读到的数字可以用 Matter ID 查询 翻译。

swift读 Descriptor 与通配读取
import Matter

let device = MTRBaseDevice(nodeID: nodeID, controller: controller)

// 1. 端点 0 的 PartsList:设备有哪些端点
let root = MTRBaseClusterDescriptor(device: device, endpointID: 0, queue: .main)
let endpoints = try await root.readAttributePartsList() as? [NSNumber] ?? []

for ep in endpoints {
    let descriptor = MTRBaseClusterDescriptor(device: device, endpointID: ep, queue: .main)

    // 2. 这个端点是什么设备(门锁端点:0x000A 门锁 + 0x0011 电源)
    let types = try await descriptor.readAttributeDeviceTypeList()
        as? [MTRDescriptorClusterDeviceTypeStruct] ?? []
    for t in types {
        print("EP(ep) type=0x(String(t.deviceType.uint32Value, radix: 16)) rev=(t.revision)")
    }

    // 3. 这个端点有哪些 Cluster
    let servers = try await descriptor.readAttributeServerList() as? [NSNumber] ?? []
}

// 或者:通配读取,一次拿回设备全部原始属性(三个参数都传 nil)
let all = try await device.readAttributes(withEndpointID: nil, clusterID: nil,
                                          attributeID: nil, params: nil, queue: .main)

限制与注意事项

iOS Matter 开发中的关键限制:

Thread 设备配网受限

MatterSupport 扩展无法配网 Thread 设备(返回 "Thread Border Router Required" 错误),这是已知 Bug(FB15614070)。目前仅 Apple Home App 在 iOS 18+ 上支持 Thread 设备直连。

开发者证书必装

"Bluetooth Central Matter Client Developer Mode" 证书必须安装在所有测试设备上(iPhone、HomePod、Apple TV),否则 BLE 配网静默失败。证书会定期过期需要续签。

TestFlight 配网问题

TestFlight 构建的应用在未安装 Matter Client Developer Profile 的设备上可能配网失败。

独立 Fabric 不可见

直接通过 Matter.framework 配网(不经过 Apple Home)会创建独立 Fabric,设备不会出现在 Apple Home 中。生产环境应使用 MatterSupport。

Thread 边界路由器需求

Thread 设备需要 HomePod mini、HomePod 2 代或 Apple TV 4K 作为边界路由器。原版 HomePod 和 Apple TV HD 没有 Thread 射频。

API 风格为 Objective-C

所有 MTR* 类都是 Objective-C 接口,Swift 通过桥接调用。命令参数必须使用 Matter 特定的 data-value 字典格式。

参考资源