You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:20:03