iOS向Apple Watch发消息时遇WC Application context data is nil问题排查
问题排查:iOS向Apple Watch发消息时出现「WC Application context data is nil」错误
我尝试在iOS应用处于活跃状态时向Apple Watch发送信息,却遇到了「WC Application context data is nil」的问题。当前状态信息显示:isReachable = true、activationState = 2,配置文件与身份验证均无异常。以下是iOS端和watchOS端基于WatchConnectivity的实现代码:
iOS端代码
final class ConnectivityiOSModel: NSObject, WCSessionDelegate { let session = WCSession.default static let shared = ConnectivityiOSModel() override private init() { super.init() if WCSession.isSupported() { session.delegate = self session.activate() } } func send(message: [String: Any]) { guard WCSession.default.isWatchAppInstalled else { print("Connection: watch app is not installed") return } session.sendMessage(message) { _ in } } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { if let error = error { print( "Connection: error \(error.localizedDescription)" ) } else { // These print calls are just for debugging. // activationState values re // notActivated = 0, inactive = 1, activated = 2 print( "Connection: activationState = \(activationState.rawValue)" ) print( "Connection: reachable? \(session.isReachable)" ) } } func sessionDidBecomeInactive(_ session: WCSession) { session.activate() } func sessionDidDeactivate(_ session: WCSession) { session.activate() } }
watchOS端代码
final class ConnectivityWatchOSModel: NSObject, WCSessionDelegate, ObservableObject { let session = WCSession.default static let shared = ConnectivityWatchOSModel() override private init() { super.init() if WCSession.isSupported() { session.delegate = self session.activate() } } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { } public func session(_ session: WCSession, didReceiveMessage message: [String: Any]) { NotificationCenter.default.post(name: .messageReceived, object: nil) } }
排查出的问题及修复方案
sendMessage缺少错误处理:当前调用
session.sendMessage只实现了成功回调,未处理失败场景,无法捕获发送时的具体错误信息。补充错误回调:func send(message: [String: Any]) { guard WCSession.default.isWatchAppInstalled else { print("Connection: watch app is not installed") return } session.sendMessage(message) { response in // 可选:处理Watch端返回的响应 } errorHandler: { error in print("消息发送失败:\(error.localizedDescription)") } }watchOS端缺失必填代理方法:
WCSessionDelegate要求实现sessionDidBecomeInactive和sessionDidDeactivate方法,缺失会导致会话状态异常,进而引发上下文相关错误。在watchOS代码中补充:func sessionDidBecomeInactive(_ session: WCSession) { session.activate() } func sessionDidDeactivate(_ session: WCSession) { session.activate() }确认发送时机:即使
isReachable为true,会话刚激活完成时底层连接可能未完全就绪。建议在activationDidCompleteWith确认激活状态为activated后,再执行发送操作,避免应用启动后立即发送。检查上下文更新操作:「WC Application context data is nil」错误常与
updateApplicationContext操作相关,若代码其他位置调用过该方法并传入nil值,会导致会话上下文异常。排查是否存在此类调用。
内容的提问来源于stack exchange,提问作者crash
相关产品推荐
相关产品推荐

