Независимое приложение Watch с использованием инфраструктуры WatchConnectivity - PullRequest
1 голос
/ 20 февраля 2020

Можно ли использовать инфраструктуру WatchConnectivity при создании независимого приложения watchOS?

В документации https://developer.apple.com/documentation/watchkit/creating_independent_watchos_apps говорится, что "Независимое приложение может использовать WatchConnectivity для передачи информации из своего iOS приложение-компаньон, когда доступно устройство iOS ... "

Но как мы можем передавать данные между приложением iOS и приложением watchOS? Объект WCSession всегда возвращает false при проверке свойства isReachable.

Спасибо за помощь :)

1 Ответ

2 голосов
/ 25 февраля 2020

Прежде чем вы сможете использовать WatchConnectivity, WCSession необходимо активировать как на iOS, так и на watchOS ( Apple предлагает , чтобы вы сначала проверили, что устройство поддерживает WatchConnectivity).

Активация выполняется асинхронно. После завершения func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) вызывается в делегате объекта сеанса (который должен быть установлен при активации активации).
Если активация прошла успешно, состояние активации теперь равно .activated. Только тогда может быть начата любая передача.

Существует несколько видов перевода . Некоторые требуют, чтобы .isReachable было правдой, а некоторые нет.

updateApplicationContext(_:) отправляет словарь на устройство-партнер. Он будет получен, когда устройство активно. Если эта функция вызывается несколько раз до того, как устройство-партнер будет активным, будет получен только последний словарь. Этот перевод не требует .isReachable.

transferUserInfo(_:) также отправляет словарь, но все словари доставляются, если функция вызывается несколько раз. Этот перевод также не требует .isReachable.

sendMessage(_:replyHandler:errorHandler:) отправляет также словарь, и снова все словари доставляются, если функция вызывается несколько раз. Для этой передачи требуется , требуется .isReachable.
Если указано replyHandler, необходимо убедиться, что оно действительно доступно, когда система пытается вызвать его. (Может случиться, что приложение вызывает эту функцию, переходит в фоновый режим перед отправкой ответа, а затем завершается системой. Если затем вызывается ответ, поток обработает sh.).

Существуют и другие виды передачи данных, файлов и других сложностей, см. Документы.

Теперь .isReachable обрабатывается по-разному на iOS и watchOS .

iOS: .isReachable равно true, если парные и активные часы находятся в диапазоне, работает соответствующее расширение WatchKit, а свойство .isReachable расширения WatchKit имеет значение true.

watchOS: .isReachable равно true, если расширение WatchKit работает на переднем плане или работает с высоким приоритетом на заднем плане, а устройство iOS находится в пределах диапазона. Обратите внимание, что приложение iOS - это , а не , необходимое для активной работы. Если часы запускают передачу, а приложение iOS не активно, оно запускается в фоновом режиме и может обрабатывать связь.

Вы упомянули, что .isReachable всегда false.
Так что, если это относится к приложению watchOS, причина может заключаться в том, что активация WCSession не была успешно завершена, или iOS устройство не находится в пределах диапазона.
Если это относится к приложению iOS, причина может снова заключаться в том, что активация WCSession не была успешно завершена, приложение наблюдения не работает на переднем плане или не работает с высокий приоритет на заднем плане, или часы не в пределах досягаемости.
Надеюсь, это немного поможет!

...