Apple Watch WCConnectionDelegate,有时在ActivationDidComplete中发送消息失败?

时间:2018-11-03 17:25:45

标签: swift watchkit wcsession

我遇到一个问题,当通过WCConnection发送消息时,如果在委托方法session.sendMessage中调用activationDidCompleteWith有时会失败。这个问题并非每次都能重现(实际上,它在大多数时间都有效)。

但是通过在我的UI中使用按钮强制session.sendMessage(调用相同的加载代码)会立即成功进行会话通信,因此我知道问题不在会话本身或主应用程序中。

假设会话已准备好接受activationDidCompleteWith中的通信是否不安全?有没有更好的地方打电话给我的初次交流?

1 个答案:

答案 0 :(得分:1)

根据我的经验,手表操作系统相当复杂,尤其是在使用旧型号手表时。话虽如此,我认为问题的答案是:“假设会话准备好接受ActivationDidCompleteWith中的通信是否不安全?”是的,假设是不安全的。

在我自己的应用中,我遇到的情况与您的情况非常相似,我通过发送一条消息直到收到响应来解决该问题。

    // false until a response is received from the phone
    let receivedResponse: Bool = false 

    // function that sends the message
    func requestResponse() {
        guard WCSession.default.isReachable else {
            print("Phone not reachable")
            return
        }

        // callback that handles response
        let responseHandler: ([String: Any]) -> () = { response in
            receivedResponse = true
            callback(response)
        }

        WCSession.default.sendMessage(["Request": "Response"],
                                      replyHandler: responseHandler) { error in
            print(error.localizedDescription)
        }
    }

    // timer that calls the request function repeatedly
    let retryTimer = Timer.scheduledTimer(withTimeInterval: 1,
                                          repeats: true) { timer in
        if receivedResponse {
            // we know we got a response so clean up timer
            timer.invalidate()
        }
        requestResponse()
    }