iOS开发:使用TuyaSDK配对设备时无法触发Delegate协议方法
iOS TuyaSDK 设备配对Delegate回调无法触发问题
我是iOS开发新手,正在使用TuyaSDK开发IoT应用(已完成Android版本)。设备能正常完成配对,但Delegate类的protocol方法始终无法进入,无法监听配对成功或失败的状态反馈。
原代码
import SwiftUI import TuyaSmartHomeKit import TuyaSmartDeviceKit import Toast import TuyaSmartActivatorKit struct HomeDevices: View{ @State var homeId: Int64 = 0 @State var token: String = "" @State var devId: String = "" @State var device: TuyaSmartDevice? let homeManager: TuyaSmartHomeManager = TuyaSmartHomeManager() var body: some View { VStack{ Button("Crear casa"){ addHome() }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:-100) Button("Encender"){ publishDps(estado : true) }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:30) Button("Apagar"){ publishDps(estado : false) }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:90) } } func addHome() { homeManager.addHome(withName: "Home", geoName: "Bolivia", rooms: ["Quantum"], latitude: 0, longitude: 0, success: { (homeId) in print("add home success") print(homeId) getToken(homeId: homeId) }) { (error) in if let e = error { print("add home failure: \(e)") } } } func getToken(homeId : Int64){ TuyaSmartActivator.sharedInstance()?.getTokenWithHomeId(homeId, success: { (token) in print("getToken success: \(String(describing: token))") startConfigWiFi(token: token!) }, failure: { (error) in if let e = error { print(homeId) print("getToken failure: \(e)") } }) } func startConfigWiFi(token: String) { let delegate = tuyaSmartActivatorDelegate.init() delegate.StartSync(token: token) } func publishDps(estado : Bool) { device = TuyaSmartDevice(deviceId: "eb153db66617bd33e5dvi1") //手动传入设备ID let dps = ["1" : estado] device?.publishDps(dps, success: { print("publishDps success") }, failure: { (error) in if let e = error { print("publishDps failure: \(e)") } }) } } struct HomeDevices_Previews: PreviewProvider { static var previews: some View { HomeDevices() } } class tuyaSmartActivatorDelegate: NSObject, TuyaSmartActivatorDelegate { override init() { super.init() TuyaSmartActivator.sharedInstance().delegate = self } func StartSync(token:String){ TuyaSmartActivator.sharedInstance()?.startConfigWiFi(TYActivatorModeEZ, ssid: "QUANTUM", password: "almacenqnt22*", token: token, timeout: 1000) } //MARK: - TuyaSmartActivatorDelegate //代码从未进入这个方法 func activator(_ activator: TuyaSmartActivator!, didReceiveDevice deviceModel: TuyaSmartDeviceModel!, error: Swift.Error!) { print("Anything") } }
期望的回调处理逻辑
func activator(_ activator: TuyaSmartActivator!, didReceiveDevice deviceModel: TuyaSmartDeviceModel!, error: Error!) { if deviceModel != nil && error == nil { // 设备配对成功,执行后续操作 } if let e = error { // 设备配对失败,打印错误信息 print("\(e)") } }
问题原因及修复方案
问题根源
你在startConfigWiFi方法中创建的tuyaSmartActivatorDelegate是局部变量,方法执行完毕后这个实例会被系统销毁,导致TuyaSmartActivator找不到有效的代理对象,因此无法触发回调方法。
修复步骤
在View中持有代理实例:
在HomeDevices结构体中添加@StateObject属性来保存代理实例,确保它的生命周期和View一致,不会被提前销毁。调整代理类实现:
修正类名(遵循Swift大驼峰命名规范),并确保代理设置正确。修改配网启动逻辑:
直接使用持有的代理对象启动配网,不再创建局部代理实例。
修改后的完整代码
import SwiftUI import TuyaSmartHomeKit import TuyaSmartDeviceKit import Toast import TuyaSmartActivatorKit struct HomeDevices: View{ @State var homeId: Int64 = 0 @State var token: String = "" @State var devId: String = "" @State var device: TuyaSmartDevice? // 持有代理实例,确保生命周期与View一致 @StateObject private var activatorDelegate = TuyaActivatorDelegate() let homeManager: TuyaSmartHomeManager = TuyaSmartHomeManager() var body: some View { VStack{ Button("Crear casa"){ addHome() }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:-100) Button("Encender"){ publishDps(estado : true) }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:30) Button("Apagar"){ publishDps(estado : false) }.font(.title2) .fontWeight(.bold) .frame(width:150, height:20) .foregroundColor(.white) .padding() .background(Color("colorbotones")) .cornerRadius(16) .shadow(color: .gray, radius: 5, x: 0, y: 5) .offset(y:90) } } func addHome() { homeManager.addHome(withName: "Home", geoName: "Bolivia", rooms: ["Quantum"], latitude: 0, longitude: 0, success: { (homeId) in print("add home success") print(homeId) getToken(homeId: homeId) }) { (error) in if let e = error { print("add home failure: \(e)") } } } func getToken(homeId : Int64){ TuyaSmartActivator.sharedInstance()?.getTokenWithHomeId(homeId, success: { (token) in print("getToken success: \(String(describing: token))") startConfigWiFi(token: token!) }, failure: { (error) in if let e = error { print(homeId) print("getToken failure: \(e)") } }) } func startConfigWiFi(token: String) { // 使用持有的代理实例启动配网 activatorDelegate.startSync(token: token) } func publishDps(estado : Bool) { device = TuyaSmartDevice(deviceId: "eb153db66617bd33e5dvi1") //手动传入设备ID let dps = ["1" : estado] device?.publishDps(dps, success: { print("publishDps success") }, failure: { (error) in if let e = error { print("publishDps failure: \(e)") } }) } } struct HomeDevices_Previews: PreviewProvider { static var previews: some View { HomeDevices() } } // 修正类名,遵循Swift命名规范 class TuyaActivatorDelegate: NSObject, TuyaSmartActivatorDelegate { override init() { super.init() // 设置代理 TuyaSmartActivator.sharedInstance().delegate = self } // 方法名改为小驼峰 func startSync(token:String){ TuyaSmartActivator.sharedInstance()?.startConfigWiFi(TYActivatorModeEZ, ssid: "QUANTUM", password: "almacenqnt22*", token: token, timeout: 1000) } //MARK: - TuyaSmartActivatorDelegate func activator(_ activator: TuyaSmartActivator!, didReceiveDevice deviceModel: TuyaSmartDeviceModel!, error: Swift.Error!) { if deviceModel != nil && error == nil { print("设备配对成功,设备ID:\(deviceModel.deviceId ?? "")") // 这里可以执行配对成功后的逻辑,比如保存设备ID、更新UI等 } if let e = error { print("设备配对失败:\(e)") } } }
内容的提问来源于stack exchange,提问作者Emanuel Acosta Gutierrez
相关产品推荐
相关产品推荐

