watchOS,WCSession activationDidCompleteWith“已激活”,但无法访问

时间:2017-02-10 05:27:59

标签: ios swift

启动时,我会让手表向iOS设备发送消息,让应用知道它已准备好接收更新的数据。有时这段代码工作正常,有时却没有。

它经常因以下调试输出而失败:

16:12:15.150|WatchSessionManager|WC Session activated with state: 2 (0 - notActivated, 1 - inactive, 2 - activated)
16:12:15.194|WatchSessionManager|Not reachable

根据我在Apple文档中读取的内容,一旦激活了连接,您就可以发送这样的实时消息。连接激活后为什么会失败?

感谢。

作为参考,在ExtensionDelegate中调用以下代码:

func applicationDidFinishLaunching() {
    WatchSessionManager.sharedManager.startSession() //connect to iPhone
}

代码:

func startSession() {
    if WCSession.isSupported() {
        let session  = WCSession.default()
        session.delegate = self
        session.activate()
    }
}

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    if let error = error {
        print("WC Session activation failed with error: \(error.localizedDescription)")
        return
    }

    debug.log(tag: "WatchSessionManager", content: "WC Session activated with state: \(activationState.rawValue) (0 - notActivated, 1 - inactive, 2 - activated)")

    if WCSession.default().isReachable {
        debug.log(tag: "WatchSessionManager", content: "Requesting")
        let message = ["request": "masterList"]

        WCSession.default().sendMessage(message, replyHandler: { (replyDict) -> Void in
            //do stuff

        }, errorHandler: { (error) -> Void in
            self.debug.log(tag: "WatchSessionManager", content: "Send to iOS app failed with error \(error)")
        })
    }
    else {
        debug.log(tag: "WatchSessionManager", content: "Not reachable")
    }
}

4 个答案:

答案 0 :(得分:2)

对于那些在类似船上的人,我从未找到导致这个问题的原因。但是,作为一种解决方法,我循环启动会话功能,在连接失败时每隔几秒尝试一次新连接,并且需要发送/接收数据。第二次连接尝试每次都基本成功。

答案 1 :(得分:1)

在手表和手机之间发送任何消息之前,您可能需要检查activationStateactiveisReachabletrue。正如上面评论检查文档中所述 - https://developer.apple.com/reference/watchconnectivity/wcsession/1615683-isreachable

答案 2 :(得分:0)

这是即使在激活WCSession的情况下也无法接通电话的原因:它不在手表范围内,蓝牙关闭或电话hasn't been unlocked since its last reboot

另请参阅Apple docs for isReachable

答案 3 :(得分:0)

尝试使用sessionReachabilityDidChange(_ session:WCSession)WCSessionDelegate方法。