Watch OS 应用程序无法与 iOS 应用程序连接

pan*_*kaj 5 objective-c ios swift watchkit

我正在尝试将我的 Watch OS 应用程序与 iOS 应用程序连接并获取一些数据,但是当我尝试与 iOS 应用程序连接时出现以下错误:

[WC] __28-[WCSession activateSession]_block_invoke_2 sessionReadyForInitialStateWithCompletionHandler 由于 NSXPCConnectionInterrupted 失败

__44-[WCSession updateApplicationContext:error:]_block_invoke 由于 WCErrorCodeSessionNotActivated WatchConnectivity 会话尚未激活而失败。

iOS应用代码:

- (void) startSession{
if ([WCSession isSupported]) {
    self.session = [WCSession defaultSession];
    self.session.delegate = self;
    [self.session activateSession];
}
Run Code Online (Sandbox Code Playgroud)

}

观看操作系统代码:

func startSession() {
    if(session.activationState != .activated){
        session.delegate = self
        session.activate()
    }
}
public func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?){
    print("activationDidCompleteWith")
    if activationState == WCSessionActivationState.activated {
        NSLog("Activated")
        if(WCSession.default().isReachable){

            do {
                try session.updateApplicationContext(
                    [WatchRequestKey : "updateData"]
                )
            }
            catch let error as NSError {
                print("\(error.localizedDescription)")
            }
        }
    }
    
    if activationState == WCSessionActivationState.inactive {
        NSLog("Inactive")
    }
    
    if activationState == WCSessionActivationState.notActivated {
        NSLog("NotActivated")
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS 应用程序在目标 C 中,手表应用程序在 swift 中

我首先执行我的 iOS 应用程序代码,它的委托方法运行,但是当我运行 watch os app 时,它无法执行任何委托方法,并产生上述错误。

spa*_*sas 1

从 Watch OS v2.2 开始,该方法异步activate()运行。因此,在您的代码中,在调用后立即调用并不能保证在尝试更新应用程序上下文时实际激活会话。updateApplicationContextactivate()

正确的流程是将您的消息移至session(_:activationDidCompleteWith:error:),例如:

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    if activationState == .activated {
       // Update application context here
    }
}
Run Code Online (Sandbox Code Playgroud)