watchOS - Показывает в реальном времени данные о вылете осложнений

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

Можно ли показывать (или обновлять) данные в реальном времени об осложнениях? Например, показывая "3 минуты до станции X". Данные могут меняться каждую минуту, основываясь на информации, получаемой из API общественного транспорта.

Как мне сделать это на watchOS 2 или watchOS 3?

Я знаю, что приложение ETA показывает время в пути, но я не уверен, как они этого добиваются.

1 ответ

Решение

Возможны ли обновления в реальном времени?

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

    Чтобы минимизировать энергопотребление, ClockKit просит вас предоставить столько данных, сколько у вас имеется, а затем кэширует данные и отображает их при необходимости.

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

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

  • Как только ежедневный бюджет исчерпан, звоните reloadTimeline (а также extendTimeline) ничего не делать.

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

Как осложнение может отображать относительное время?

  • Вы можете использовать CLKRelativeDateTextProviderсоздать форматированное относительное время, которое может меняться поминутно.

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

Как может осложнение часто обновляться?

  • Вы можете использовать усложняющее push-обновление (либо с удаленного сервера, либо локально с телефона в iOS 10).

    Существует ограничение в 50 сложных обновлений в день.

  • Вы можете получить данные на телефоне и использовать transferCurrentComplicationUserInfo,

    В watchOS 2 это зависело только от ежедневного бюджета. В watchOS 3 это теперь ограничено 50 передачами в день.

    См. Является ли TransferCurrentComplicationUserInfo более подходящим для обновления сложности? Больше подробностей.

  • В watchOS 2 вы можете использовать getNextRequestedUpdateDate запланировать следующий раз, чтобы обновить вашу сложность.

    Это не может происходить чаще, чем каждые десять минут.

    Обратите внимание, что приложения watchOS 3 должны быть обновлены для использования задач приложения фонового обновления. Основным преимуществом является то, что фоновые задачи смогут сделать больше, чем просто обновить вашу сложность. Они также могут обрабатывать выборку данных, обновлять вашу модель после получения данных, а также обновлять снимок док-станции.

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

    Бюджет задач позволяет 4 задачи в час. Увидеть scheduleBackgroundRefresh Больше подробностей.

    Обратите внимание, что задачи приложения фонового обновления не должны использовать более 10% ЦП.

Рекомендуемые сессии WWDC 2016

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

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

Пример кода Apple

Apple предоставляет образец кода WatchBackgroundRefresh, демонстрирующий, как использовать WKRefreshBackgroundTask обновить приложения WatchKit в фоновом режиме.

Чтобы обновить любое активное осложнение в фоновой задаче, вы просто добавили бы код для перезагрузки (или продления) временной шкалы:

let complicationServer = CLKComplicationServer.sharedInstance()

for complication in activeComplications {
    complicationServer.reloadTimelineForComplication(complication)
} 
Другие вопросы по тегам