You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否一次性导出HomeKit设备数据?批量获取特征方案咨询

批量提取HomeKit设备所有Characteristic并转为字典/JSON

一、生成嵌套字典结构

修改现有遍历逻辑,逐步组装配件、服务、特征的层级结构,确保数据格式符合后续JSON转换要求:

func accessoryDataDictionary(for accessory: HMAccessory) -> [String: Any] {
    var serviceDictionaries = [[String: Any]]()
    
    for service in accessory.services {
        var characteristicDict = [String: Any]()
        for characteristic in service.characteristics {
            // 根据特征格式处理对应值,避免JSON序列化失败
            let value: Any?
            switch characteristic.format {
            case .bool:
                value = characteristic.value as? Bool
            case .int, .uint8, .uint16, .uint32, .uint64:
                value = characteristic.value as? Int
            case .float, .float64:
                value = characteristic.value as? Double
            case .string:
                value = characteristic.value as? String
            case .data:
                value = (characteristic.value as? Data)?.base64EncodedString()
            default:
                value = characteristic.value ?? "不支持的类型"
            }
            characteristicDict[characteristic.localizedDescription] = value
        }
        
        let serviceDict: [String: Any] = [
            "service_name": service.localizedName,
            "characteristics": characteristicDict
        ]
        serviceDictionaries.append(serviceDict)
    }
    
    return [
        "accessory_name": accessory.name,
        "services": serviceDictionaries
    ]
}

// 处理多个配件,生成数组结构
func allAccessoriesData(_ accessories: [HMAccessory]) -> [[String: Any]] {
    return accessories.map { accessoryDataDictionary(for: $0) }
}

二、转换为JSON字符串

利用JSONSerialization将生成的字典/数组转为格式化后的JSON字符串:

func convertToJSONString(from data: Any) -> String? {
    guard JSONSerialization.isValidJSONObject(data) else {
        return nil
    }
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)
        return String(data: jsonData, encoding: .utf8)
    } catch {
        print("JSON转换失败: \(error.localizedDescription)")
        return nil
    }
}

// 使用示例
if let firstHome = homeManager.homes.first, let accessories = firstHome.accessories as? [HMAccessory] {
    let allDeviceData = allAccessoriesData(accessories)
    if let jsonString = convertToJSONString(from: allDeviceData) {
        print(jsonString)
    }
}

关键说明

  • 特征值类型适配:HomeKit特征值包含多种格式,必须针对性转换(比如Data转Base64),否则会导致JSON序列化失败
  • 本地化名称:使用localizedName/localizedDescription可以匹配设备在Home应用中显示的名称,提升可读性
  • 结构合法性:最终生成的字典结构严格遵循JSON规范,修正了原示例中数组直接嵌套键值对的语法错误

内容的提问来源于stack exchange,提问作者Luke Irvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:27:47