Swift 5使用HomeKit SDK开发iOS应用控制插座开关的示例代码咨询
HomeKit Swift 实现智能插座开关控制示例
前置配置
- 项目设置中开启「HomeKit」能力
- 在
Info.plist中添加NSHomeKitUsageDescription权限描述,说明App使用HomeKit的用途
核心实现代码
基础属性与代理设置
import HomeKit import UIKit class OutletControlViewController: UIViewController { // 声明HomeKit家庭管理实例 private let homeManager = HMHomeManager() // 存储目标插座的开关特性 private var powerStateCharacteristic: HMCharacteristic? override func viewDidLoad() { super.viewDidLoad() // 设置家庭管理代理 homeManager.delegate = self } }
目标设备查找逻辑
extension OutletControlViewController: HMHomeManagerDelegate { // 家庭管理器加载完成后执行查找逻辑 func homeManagerDidUpdateHomes(_ manager: HMHomeManager) { // 1. 查找名称为Holmdel的目标家庭 guard let targetHome = manager.homes.first(where: { $0.name == "Holmdel" }) else { print("未找到目标家庭Holmdel") return } // 2. 查找家庭下名称为Bedroom的目标房间 guard let targetRoom = targetHome.rooms.first(where: { $0.name == "Bedroom" }) else { print("未找到目标房间Bedroom") return } // 3. 查找房间内名称为SYLVANIA Outlet-4515的插座设备 guard let targetOutlet = targetRoom.accessories.first(where: { $0.name == "SYLVANIA Outlet-4515" }) else { print("未找到目标插座设备") return } // 4. 查找插座的开关服务 guard let powerService = targetOutlet.services.first(where: { $0.serviceType == HMServiceTypeOutlet }) else { print("设备未识别到插座服务") return } // 5. 查找开关服务对应的电源状态特性 guard let powerChar = powerService.characteristics.first(where: { $0.characteristicType == HMCharacteristicTypePowerState }) else { print("未找到电源控制特性") return } // 保存特性供后续控制使用 self.powerStateCharacteristic = powerChar } }
插座开关控制方法
// MARK: 插座控制方法 extension OutletControlViewController { /// 控制插座开关 /// - Parameter isOn: true为开,false为关 func controlOutlet(isOn: Bool) { guard let powerChar = powerStateCharacteristic else { print("电源控制特性未初始化,请先确认设备查找完成") return } // 写入开关状态 powerChar.writeValue(NSNumber(value: isOn)) { error in if let error = error { print("控制失败,错误:\(error.localizedDescription)") return } print("插座\(isOn ? "开启" : "关闭")成功") } } }
注意事项
- 设备必须已经通过苹果家庭App完成配对,加入到对应的家庭和房间下
- HMHomeManager的回调在子线程触发,如果需要更新UI请切换到主线程执行
- 首次启动App会弹出HomeKit权限申请弹窗,用户授权后才能正常访问家庭数据
内容的提问来源于stack exchange,提问作者Gene Fernandez
相关产品推荐
相关产品推荐

