Прежде чем вы сможете использовать 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 не была успешно завершена, приложение наблюдения не работает на переднем плане или не работает с высокий приоритет на заднем плане, или часы не в пределах досягаемости.
Надеюсь, это немного поможет!