У меня проблема, когда при отправке сообщения через WCConnection session.sendMessage иногда дает сбой, если он вызван в методе делегата activationDidCompleteWith. Проблема не повторяется каждый раз (на самом деле, это срабатывает большую часть времени).

Но принуждение session.sendMessage с помощью кнопки в моем пользовательском интерфейсе (вызов идентичного кода загрузки) немедленно приводит к успешному обмену сеансом, поэтому я знаю, что проблема не в самом сеансе или главном приложении.

Небезопасно предполагать, что сеанс готов принять связь в activationDidCompleteWith? Есть ли лучшее место для моего первого разговора?

-1
ccrama 3 Ноя 2018 в 20:25

1 ответ

Лучший ответ

По моему опыту, часовая ОС довольно привередлива, особенно при использовании старых моделей часов. При этом я думаю, что это ответ на вопрос: «Небезопасно ли предполагать, что сеанс готов к приему связи в activateDidCompleteWith?» да, предполагать это небезопасно.

В моем собственном приложении случай очень похож на ваш, и я решил его, отправив сообщение до тех пор, пока не будет получен ответ.

    // 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()
    }
1
Myk 5 Ноя 2018 в 23:27