Swift中WCSession因缺少代理激活被拒,如何解决?
解决WCSession激活失败:"denying activation due to missing delegate" 错误
你遇到的这个错误核心是WCSession的初始化和delegate绑定顺序完全搞反了,咱们一步步捋清楚问题并修正:
问题根源
看你原来的syncToAppleWatch方法:
func syncToAppleWatch(){ var session: WCSession? if WCSession.isSupported() {//4.1 session?.delegate = self // 这里session还是nil!设置delegate根本没生效 session = WCSession.default//4.2 session?.activate()//4.4 } }
你先声明了一个nil的session变量,然后试图给它设置delegate——这时候session还是空的,这行代码等于白写;之后才初始化session = WCSession.default,但这时候已经没给这个新实例绑定delegate了,激活时系统自然找不到有效的delegate,就会抛出你看到的错误。
修正后的完整代码
调整顺序,先拿到有效的session实例,再设置delegate,最后激活:
extension UIViewController: WCSessionDelegate { public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { // 这里可以处理激活完成的逻辑,比如判断状态或错误 if let error = error { print("WCSession激活失败: \(error.localizedDescription)") } else { print("WCSession激活成功,状态: \(activationState.rawValue)") } } public func sessionDidBecomeInactive(_ session: WCSession) { // 处理session变为非活跃状态的逻辑 } public func sessionDidDeactivate(_ session: WCSession) { // 建议重新激活session,避免后续无法通信 session.activate() } //MARK: -SYNC DATA TO APPLE WATCH func syncToAppleWatch(){ guard WCSession.isSupported() else { print("当前设备不支持WCSession") return } let session = WCSession.default session.delegate = self session.activate() } }
关键注意点
- 必须先获取
WCSession.default实例,再给它设置delegate,顺序绝对不能乱 - 激活
activate()一定要在设置delegate之后执行 - 在
sessionDidDeactivate方法里调用session.activate(),可以避免session因某些原因取消激活后无法恢复通信
这样调整后,你在viewDidLoad里调用syncToAppleWatch(),应该就能正常激活WCSession,不会再出现"missing delegate"的错误了。
内容的提问来源于stack exchange,提问作者TheCesco1988
相关产品推荐
相关产品推荐

