Как часто обновлять виджет сегодня в центре уведомлений?
Я обнаружил, что мой виджет Центра уведомлений загружается не очень часто. Из-за этого представляются устаревшие данные. Я не смог найти способ обновить виджет каждый раз, когда открываю представление "Сегодня". Я видел такие приложения, как NBA Gametime, которые могут обновляться каждый раз, когда я открываю окно, чтобы увидеть виджет.
Как я могу получить эту функциональность в моем приложении?
2 ответа
Исходя из моих собственных экспериментов, а также отчетов в этой ветке SO, кажется, что TodayViewController.viewDidLoad()
Функция вызывается каждый раз, когда открывается область Сегодня / Уведомления. В частности, Karl Monaghan сообщил в комментарии, что в примечаниях к выпуску iOS 8.1 сказано следующее:
Расписание и предполагаемое использование widgetPerformUpdateWithCompletionHandler: предназначено как удобный дом для всей логики обновления данных / модели. В случае реализации система будет в нужное время вызывать виджет для обновления его состояния, как при отображении Центра уведомлений, так и в фоновом режиме. Реализация необходима для включения фоновых обновлений. Ожидается, что виджет выполнит работу по обновлению асинхронно и максимально отключит основной поток.
Итак, чтобы ответить на ваш вопрос:
- Я не думаю, что мы когда-либо действительно узнаем, как часто
widgetPerformUpdateWithCompletionHandler
метод вызывается, и я думаю, что Apple предпочитает так viewDidLoad
Функция вызывается каждый раз, когда виджет отображается, поэтому возможно, что вы могли бы вызвать функцию update внутри этого метода. Или вы можете просто поместить все обновления, которые вам нужны, чтобы отображаться в виджете внутри этой функции, хотя я не знаю, какое влияние это окажет на производительность приложения.
Надеюсь это поможет.
Обновить
Я также обнаружил, что любой из initWithCoder
или же initWithNibName
Кажется, вызывается каждый раз, когда виджет отображается на экране, поэтому возможно, что вы могли бы делать вызовы для обновления вашего виджета в этих файлах, но если я правильно помню, представление на самом деле не создается в данный момент, поэтому лучше НЕ ставить Ваш код для обновления вашего виджета в этих функциях.
В вашем widgetPerformUpdateWithCompletionHandler
вам нужно, чтобы ваш виджет знал, что он должен обновить. Apple Docs
-(void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
// Perform any setup necessary in order to update the view.
// If an error is encoutered, use NCUpdateResultFailed
// If there's no update required, use NCUpdateResultNoData
// If there's an update, use NCUpdateResultNewData
completionHandler(NCUpdateResultNewData);
}