Обновление фона виджета iOS

Согласно тому, что Apple говорит о widgetPerformUpdateWithCompletionHandler:, виджет iOS может обновлять свой контент даже тогда, когда виджет не виден.

В моем сеансе отладки я отметил, что TodayViewController освобождается каждый раз, когда представление центра уведомлений исчезает, поэтому мои вопросы:

Как мой TodayViewController может реагировать на widgetPerfomrUpdateWithComplationHandler, если он освобожден?

Мне нужно, чтобы каждый час виджет обновлял свой контент, даже если он не виден, как я могу это сделать?

Каков жизненный цикл виджета iOS?

Помогите пожалуйста :) Спасибо


person DigitalBrain_DEV    schedule 19.02.2015    source источник


Ответы (3)


Жизненный цикл виджета управляется самой iOS.

Когда вы переходите в фоновый режим, система делает снимок вашего сегодняшнего виджета. Система управляет фоновой выборкой (фоновым жизненным циклом вашего виджета), она будет вызывать widgetPerfomrUpdateWithComplationHandler: для обновления данных вашего виджета, когда это возможно, и каждый раз делает снимок. И когда вы откроете его снова, он сначала загрузит самый последний снимок, а затем загрузит текущие данные.


Обновление содержимого виджета

Обновление содержания

Точка расширения Today предоставляет API для управления состоянием виджета и обработки обновлений его содержимого (вы можете прочитать об этом API в справочнике по платформе Notification Center). Несмотря на то, что в Today API есть несколько различий для конкретных платформ, функциональные возможности, поддерживаемые на обеих платформах, в основном одинаковы.

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

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

NCUpdateResultNewData—Новое содержимое потребовало перерисовки представления.

NCUpdateResultNoData—Виджет не требует обновления

NCUpdateResultFailed — Произошла ошибка в процессе обновления.

Ссылка на виджет Today


Обновление данных Центра уведомлений

Центр уведомлений

Примечание

Расписание и предполагаемое использование widgetPerformUpdateWithCompletionHandler: предназначено в качестве удобного дома для всей логики обновления данных/модели. Если реализовано, система будет в подходящее время вызывать виджет для обновления своего состояния, как при отображении Центра уведомлений, так и в фоновом режиме. Для включения фоновых обновлений требуется реализация. Ожидается, что виджет будет выполнять работу по обновлению асинхронно и в максимально возможной степени вне основного потока. Виджеты должны вызывать блок аргументов после завершения работы, передавая соответствующий NCUpdateResult. Виджеты НЕ должны блокировать возврат из viewWillAppear: по результатам этой операции. Вместо этого виджеты должны загружать кешированное состояние в viewWillAppear:, чтобы соответствовать состоянию представления из последнего viewWillDisappear:, а затем плавно переходить к новым данным, когда они поступают.

Ссылка на Центр уведомлений iOS 8.1


Жизненный цикл виджета

Жизненный цикл виджета

Ссылка: Жизненный цикл расширения приложения

person Midhun MP    schedule 19.02.2015
comment
То есть я не могу обновить содержимое, пока виджет не виден? Apple говорит: система будет вызывать виджет в подходящее время для обновления своего состояния, как когда Центр уведомлений виден, так и в фоновом режиме. Но в моей отладке я видел, что widgetPerformUpdate... никогда не вызывается, когда NotificationCenter находится в фоновом режиме, по крайней мере, для моего виджета). - person DigitalBrain_DEV; 19.02.2015
comment
здесь, в разделе Центра уведомлений: developer.apple.com/library /ios/releasenotes/Общие/ - person DigitalBrain_DEV; 19.02.2015
comment
@digitalPad: да, система вызовет центр уведомлений, а также ваш виджет. Но вы не можете справиться с этими частями самостоятельно. Это система, управляемая и управляемая системой. (Что-то вроде фоновой выборки) - person Midhun MP; 19.02.2015
comment
хорошо, спасибо, поэтому я не могу быть уверен, что метод вызывается достаточно рано. Есть ли другой способ обновить содержимое виджета в фоновом режиме? мне нужно, чтобы каждый час виджет загружал новую ленту, поэтому каждый раз, когда пользователь видит виджет, он обновляется - person DigitalBrain_DEV; 19.02.2015
comment
@digitalPad: На мой взгляд, это невозможно. Вы можете проверить фоновую загрузку (но это для приложения, оно также обрабатывается системой) - person Midhun MP; 19.02.2015
comment
В нем говорится, что для включения фоновых обновлений требуется реализация, это очень ясно. В любом случае, как это делается? - person mskw; 15.08.2016

Примечания к выпуску iOS8

Примечание. Расписание и предполагаемое использование widgetPerformUpdateWithCompletionHandler: предназначено в качестве удобного дома для всей логики обновления данных/модели. Если реализовано, система будет в подходящее время вызывать виджет для обновления своего состояния, как при отображении Центра уведомлений, так и в фоновом режиме. Для включения фоновых обновлений требуется реализация. Ожидается, что виджет будет выполнять работу по обновлению асинхронно и в максимально возможной степени вне основного потока. Виджеты должны вызывать блок аргументов после завершения работы, передавая соответствующий NCUpdateResult. Виджеты НЕ должны блокировать возврат из viewWillAppear: по результатам этой операции. Вместо этого виджеты должны загружать кешированное состояние в viewWillAppear:, чтобы соответствовать состоянию представления из последнего viewWillDisappear:, а затем плавно переходить к новым данным, когда они поступают.

Вам нужно реализовать оба

  • ViewDidAppear:
  • виджетперформупдатевискомплатионхандлер:

Обновите свои данные в widgetPerformUpdateWithComplationHandler: затем вызовите блок завершения с помощью NCUpdateResult.

Обновите представление в viewDidAppear: изображение запуска (моментальный снимок) будет из вашего последнего представления.DidDissappear: новое содержимое будет отображаться в конце следующего цикла выполнения.

Отдайте должное DigitalBrain_Dev для ссылки на документ.

person aumansoftware    schedule 19.04.2016

Вызовите свой API в методе func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) и вызовите завершениеHandler(NCUpdateResult.newData) .

person Friend    schedule 27.06.2019