SwiftUI中配置WCSessionDelegate遇到问题求助
解决WCSession提示「WCSession is missing its delegate」且activationDidCompleteWith不触发的问题
核心错误原因
你在PhoneAppDefaults.configure()和WatchAppDefaults.configure()中创建了临时代理对象:
// 错误写法:临时对象执行完后会被ARC立即回收 PhoneWCSessionDelegate().startSession()
WCSession对代理的引用是弱引用(weak var delegate: WCSessionDelegate?),当临时代理被释放后,WCSession找不到代理实例,就会打印「WCSession is missing its delegate」日志,同时activationDidCompleteWith等代理方法也无法触发。
修复方案
需要在单例类中强持有WCSession代理对象,保证其生命周期与App一致。
手机端修改
更新PhoneAppDefaults.swift
添加属性持有代理实例:
import Foundation import WatchConnectivity class PhoneAppDefaults { static var sharedInstance = PhoneAppDefaults() // 新增:强持有代理对象 private let sessionDelegate = PhoneWCSessionDelegate() private init() { print("*** WatchAppDefaults.sharedInstance initialized ***") } func configure() { print("*** Configuring watch defaults settings ***") // 使用持有的代理,而非临时创建 sessionDelegate.startSession() } }
手表端修改
更新WatchAppDefaults.swift
同样添加属性持有代理实例:
import Foundation import WatchConnectivity class WatchAppDefaults { static var sharedInstance = WatchAppDefaults() // 新增:强持有代理对象 private let sessionDelegate = WatchWCSessionDelegate() private init() { print("*** WatchAppDefaults.sharedInstance initialized ***") } func configure() { print("*** Configuring watch defaults settings ***") // 使用持有的代理,而非临时创建 sessionDelegate.startSession() } }
额外注意事项
- 手表端代理方法完整性:watchOS的WCSessionDelegate需要实现全部必需的代理方法,需在
WatchWCSessionDelegate中补充以下两个方法:
func sessionDidBecomeInactive(_ session: WCSession) { print("*** WCSession became inactive on watch ***") } func sessionDidDeactivate(_ session: WCSession) { print("*** WCSession deactivated on watch ***") // 如需重新激活会话,可在此调用 session.activate() }
- 初始化时机:当前在
ContentView.onAppear中触发配置是可行的,若想更早初始化,也可将配置逻辑放在App结构体的初始化方法中。
内容的提问来源于stack exchange,提问作者AdrianGutierrez
相关产品推荐
相关产品推荐

