Наблюдайте за сложностью обновления подключения с помощью transferCurrentComplicationUserInfo

У меня проблемы с фреймворками WatchConnectivity и, возможно, Clockkit. Я пытаюсь использовать transferCurrentComplicationUserInfo в приложении iOS для отправки данных на часы и обновления усложнения. Внутри моего делегата расширения на часах я реализовал метод делегата didReceiveUserInfo, в котором я обрабатываю данные, а затем вызываю, чтобы обновить сложность.

Когда я запускаю приложение iOS на симуляторе, все работает нормально. Однако, если я запускаю его на реальных устройствах, начинается передача с телефона, усложнение вызывает requestedUpdateDidBegin(), но didReceiveUserInfo внутри расширения на часах никогда не вызывается, и, следовательно, у меня нет данных по усложнению.

Какие-либо предложения? или я должен отправить отчет об ошибке?


person Simon    schedule 02.03.2016    source источник
comment
Было бы полезно увидеть код подключения ваших часов к часам.   -  person    schedule 02.03.2016
comment
@PetahChristian Разве мой код не имеет значения, поскольку он отлично работает в симуляторе, но не на устройстве. В любом случае, в родительском приложении у меня есть session.transferCurrentComplicationUserInfo(applicationDict), а затем для получения в делегате расширения на часах у меня есть func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { NSLog("Complication Update didReceiveUserInfo ExtensionDelegate") NSLog("UserInfo recieved from iPhone\n%@", userInfo.description) complicationServer.reloadTimelineForComplication(complication) } Однако он никогда не вызывается   -  person Simon    schedule 03.03.2016
comment
Какой объем полезной нагрузки вы отправляете? Допустимый размер довольно мал, и я видел, как симулятор обрабатывает большие полезные нагрузки, чем физическое устройство. Поскольку в методе передачи нет обработчика ошибок, вы, вероятно, не получите уведомления об этом.   -  person lehn0058    schedule 06.03.2016
comment
Я пробовал без полезной нагрузки, просто пустой словарь ... Все равно не повезло   -  person Simon    schedule 07.03.2016


Ответы (3)


Похоже, проблема с настройкой объекта WCSession на часах Apple Watch. Для усложнения я рекомендую сделать это в методе инициализации ExtensionDelegate. Причина этого в том, что applicationDidFinishLaunching вызывается только при запуске вашего расширения для часов (основного приложения для часов), а не при отображении усложнения или взгляда.

override init() {
    super.init()

    // Setup watch connectivity. We do this here because applicationDidFinishLaunching is only
    // called when the watch extension is being called, not when a complciation is being updated
    self.session.delegate = self
    self.session.activateSession()
}
person lehn0058    schedule 02.03.2016
comment
К сожалению, я пробовал это, метод init тоже никогда не вызывается, я просто получаю оператор журнала (который я не вставлял), в котором говорится: «Расширение получило запрос на пробуждение для поддержки осложнений и», а затем вызывается requestUpdateDidBegin (). Я раньше помещал журналы в init, и он никогда не вызывал ... - person Simon; 02.03.2016

Прежде чем определить, что расширение никогда не вызывается, вы должны проверить сообщения журнала Watch (консоль) через панель Devices. Возможно, что расширение запускается в фоновом режиме и не прикреплено к отладчику, поэтому вы не увидите сообщение NSLog в консоли Xcode.

Что еще более важно, вы могли перенести какое-то осложнение userInfo с телефона на часы, но, похоже, ничего не делаете с этим словарем после того, как часы его получили. Вам нужно сделать больше, чем просто передать текущую информацию о сложности. Источнику данных сложности потребуется доступ к этой информации при вызове getCurrentTimelineEntryForComplication (в результате перезагрузки шкалы времени).

Возможные причины

У вас не так уж много кода, поэтому я рассмотрел как transferCurrentComplicationUserInfo actually works и упомянул несвязанную проблему, с которой я столкнулся ваш код.

Без дополнительного кода сложно дать конкретный ответ, но я постараюсь помочь ради всех, у кого может возникнуть эта проблема в будущем.

Вот несколько возможных причин, по которым didReceiveUserInfo вашего расширения не вызывается.

  • Вы активировали WCSession более чем в одном месте, и передача (не) обрабатывается другим делегатом.
  • У вас не было ссылки на активированный сеанс, и он вышел за рамки.
  • Приложение не было открыто на часах.
  • Сеанс активирован недостаточно быстро или в нужном месте.
  • transferCurrentComplicationUserInfo не удалось из-за ошибки, потому что ваш телефон был заблокирован. (Это известная проблема, признанная Apple , и есть обходной путь.)

Как код поможет улучшить ваш вопрос и наши ответы

Целью предоставления кода является выявление или устранение причин, по которым что-то не работает. Код обычно необходим, чтобы помочь ответить "Почему это не работает?" вопросы программирования.

Просто потому, что это работает в симуляторе, это не гарантирует, что вы «все настроите правильно». Разумно, что тестирование на устройстве выявляет ошибки, которые вы никогда не обнаружите при тестировании в симуляторе.

person Community    schedule 03.03.2016
comment
Ясно, что вопрос прочитан не очень хорошо. Я сказал, что по запросу устройства вызывается UpdatedidBegin (). Я узнал бы об этом только в том случае, если бы отладчик был правильно подключен (что так и есть). Что касается второй части вашего ответа, я все еще думаю, что вы упускаете из виду, я уже сказал, что didReceiveInfo никогда не вызывается, что означает, что Watch Connectivity работает неправильно. В нем я обрабатываю информационный словарь и прошу обновить усложнение. Из переговоров WWDC 2015 стало ясно, что таким образом обновления могут быть доставлены на часы. - person Simon; 03.03.2016
comment
Поймите, я отправлю отчет об ошибке (у меня не осталось ЦИ :() Я отправлю решение, если оно у меня появится - person Simon; 07.03.2016
comment
Не могли бы вы разместить здесь номер радара, чтобы помочь инженерам Apple, которые наткнулись на него, легко его найти? - person ccjensen; 08.03.2016

Это может быть из-за того, что вы превысили системные ограничения на передачу данных с помощью transferCurrentComplicationUserInfo, поскольку вы можете передавать только 50 раз в день

Передача данных из iOS. Если в вашем приложении watchOS есть сопутствующее приложение iOS, вы можете собрать данные в приложении iOS, а затем передать эти данные в Apple Watch. Однако эта стратегия обновления привязывает часы к iPhone-компаньону. Вы не сможете обновить информацию, если пользователь уйдет без телефона, что может привести к устаревшим или неточным осложнениям. Кроме того, как и в случае с push-уведомлениями, система ограничивает вас до 50 переводов осложнений в день.

Вы можете проверить оставшееся время разрешенных переводов с помощью RemplicationUserInfoTransfers

person Collin Zhang    schedule 26.09.2020