Обновление сложности с Swift 3 и фоновой задачей

Для watchOS 3 Apple предлагает обновить усложнение с помощью WKRefreshBackgroundTask вместо использования getNextRequestedUpdateDate.

Как я могу определить время между двумя обновлениями, используя новый подход?

Я бы только взломал мой запрос данных (с URL-адреса) в getCurrentTimelineEntry и обновил бы сложность, но я думаю, что это не совсем то, что Apple рекомендовала бы.

Краткий пример кода будет большим подспорьем.




Ответы (1)


Обычно я освещал это в другом ответе, но я отвечу на ваш конкретный вопрос здесь.

Вы правы в том, что вам не следует взламывать контроллер усложнения для выполнения какой-либо (асинхронной) выборки. Источник данных должен только отвечать за возврат существующих данных в соответствии с запросом сервера усложнения. Это было верно для watchOS 2 и по-прежнему верно для watchOS 3.

Для watchOS 3 каждое фоновое обновление может планировать следующее.

Обзор процесса:

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

В это время ваше расширение снова будет разбужено, чтобы снова запустить весь фоновый процесс, чтобы:

  • Запросить новые данные из вашего веб-сервиса
  • Обработайте ответ и обновите хранилище данных
  • Скажите усложнению, чтобы оно само обновилось (что будет использовать новые имеющиеся данные).
  • Обновите снимок дока
  • Запланировать предстоящую задачу фонового обновления
  • Отметьте текущую задачу как выполненную.

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

Образец кода:

Если вы еще не видели его, Apple предоставляет его WatchBackgroundRefresh пример кода, чтобы продемонстрировать часть этого. Ты можешь использовать

WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate:userInfo:)

запланировать (начальную или) будущую задачу до завершения текущей задачи.

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

person Community    schedule 22.06.2016
comment
Я уже пробовал эту демоверсию, но кажется, что она не работает. Начатая задача никогда не завершается. - person Wed; 22.06.2016
comment
Что именно в нем не работает для вас? Пожалуйста, будьте конкретны. Опять же, вы должны отредактировать свой вопрос, показать код, который вы пытаетесь выполнить, и описать точную проблему, с которой вы столкнулись. На вопросы без реальных проблем с кодированием ответить труднее. - person ; 22.06.2016
comment
Вы уже ответили на мой вопрос. У меня левая проблема как раз в том, что демо от яблока не работает. Как я уже писал, проблема в том, что задача запускается, но никогда не завершается. - person Wed; 23.06.2016
comment
Следуете ли вы инструкциям в файле Readme, в которых объясняется, как использовать заводную головку для перевода приложения в фоновый режим, дождаться срабатывания обработчика и его завершения, а затем открыть док-станцию? Это работает, если вы смотрите журнал, и док-станция иногда должна показывать новое время. Что может произойти, так это то, что система откладывает фоновые задачи, так как вам разрешено только ~ 1 час. - person ; 23.06.2016
comment
Я слежу, конечно. Я тестирую на симуляторе, потому что xcode не устанавливает символы на мои часы. Стараюсь ждать дольше. - person Wed; 23.06.2016
comment
С моей стороны запускается фоновая задача и срабатывает обработчик didFinish, так что все кажется функциональным, хотя временами немного непоследовательным. Бета-программа содержит ошибки. Не могу помочь с этим аспектом. Вы можете отправить отчет об ошибке, продолжить портировать свой код, чтобы использовать новые функции, и надеяться, что они будут улучшены для бета-версии 2! - person ; 23.06.2016
comment
Я также могу подтвердить то, что видит @PetahChristian. Я попробовал пример кода как на симуляторе, так и на устройстве с бета-версией watchOS3. Ни в том, ни в другом случае это не работает. Однажды мне удалось заставить его работать правильно, но я понятия не имею, почему. Я также надеюсь, что в будущем выпуске watchOS3 эта проблема будет исправлена. - person Nidal Fakhouri; 28.07.2016
comment
В Xcode beta 4 пример проекта все еще не работает. Я вижу почти непрерывный поток WKApplicationRefreshBackgroundTasks, но никогда не WKURLSessionRefreshBacgkroundTask. То же самое происходит с моим собственным приложением для часов. - person jervine10; 02.08.2016
comment
Тестируйте с Xcode beta 6 - и все так же :-/ . Много фоновых задач, но сеанс URL-адресов никогда не печатает завершение сеанса NSURLSession для URL-адреса. Кому-нибудь удалось заставить это работать? - person Dirk; 21.08.2016
comment
Все еще не удается заставить это работать в GM, и ссылка на демонстрационный проект теперь 404. Довольно безумно. - person RealCasually; 12.09.2016
comment
Не могли бы вы (оригинальный постер или автор ответа) опубликовать какой-нибудь код? Я проверил пример проекта, но он не имеет ничего общего с осложнениями. Я не смог найти код в документах или на форумах Apple, чтобы показать, где и как запланировать серию обновлений осложнений. Например: Кто должен планировать фоновые задачи? Первый InterfaceController в расширении часов? Куда (в какой функции или методе) попадает scheduleBackgroundTasks? Как часто его нужно вызывать? (поскольку обновления сложности теоретически могут продолжаться вечно) Как согласовать/кэшировать результаты путешествий во времени? - person Erika Electra; 02.02.2017
comment
Любопытный вопрос, я хотел посмотреть, может ли кто-нибудь дать ответ. Где вы все вызываете свой метод для запуска исходной фоновой задачи? Я вызываю applicationDidFinishLaunching(), но он не всегда срабатывает. - person Zachary Bell; 28.02.2018