Apple Watch WCConnectionDelegate, отправка сообщения в ActivDidComplete иногда не удается? - PullRequest
0 голосов
/ 03 ноября 2018

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2018

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

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

    // 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()
    }
...