Когда WCSession sendMessage не может разбудить приложение iOS в фоновом режиме?

Я использую объект WCSession для отправки данных из приложения для часов (watchOS 3.3 beta 4) обратно в соответствующее приложение iOS через sendMessage(_:replyHandler:errorHandler:). Согласно документации Apple:

Вызов этого метода из вашего расширения WatchKit, когда он активен и работает, активирует соответствующее приложение iOS в фоновом режиме и сделает его доступным.

Однако я обнаружил, что если свойство isReachable объекта WCSession равно false перед вызовом sendMessage, сообщение не отправляется с этой ошибкой: Error Domain=WCErrorDomain Code=7007 "WatchConnectivity session on paired device is not reachable." UserInfo={NSLocalizedDescription=WatchConnectivity session on paired device is not reachable.}

Сеанс активирован, поэтому я считаю, что этот вызов sendMessage должен сделать приложение iOS доступным, а затем его отправить, но этого не происходит.

При каких обстоятельствах это происходит и есть ли обходные пути?


person Jeff V    schedule 06.03.2017    source источник
comment
Как вы тестируете? Это на устройстве, и телефон и часы в настоящее время подключены к Bluetooth?   -  person Cobra    schedule 13.03.2017
comment
Да, это на устройстве с подключением Bluetooth к телефону. Обычно это делает телефон доступным, но терпит неудачу в ‹ 10% случаев.   -  person Jeff V    schedule 14.03.2017


Ответы (1)


a) Если вы используете sendMessage(_, replyHandler:_, errorHandler:_) с обработчиком ответов, отличным от nil, в WCSessionDelegate аналога ios должен быть реализован метод session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void), и сообщение будет считаться доставленным, как только вы вызовете replyHandler(_:) внутри этого метода. Если этот метод не реализован, сообщение не получит ответа и вы получите ошибку тайм-аута.

б) Кроме того, я заметил, что сообщения не доставляются во время выполнения кода в любом из session(_ session: WCSession, didXXX: XXX) методов WCSessionDelegate. Похоже, все они выполняются в одной последовательной фоновой очереди.

person abjurato    schedule 28.05.2017