IOS 8 сегодня виджет перестает работать через некоторое время
Я сделал сегодня виджет для немецкой хоккейной лиги DEL.
Я загружаю следующие игры с нашего сервера и показываю их в tableView. Процесс загрузки запускается в предлагаемом методе "widgetPerformUpdateWithCompletionHandler" . Вначале я загружаю некоторые кэшированные данные в "viewWillAppear".
Все отлично работает до сих пор!
![Screenshot of the working widget.]()
Но через некоторое время (один день) виджет перестает работать. Когда я открываю центр уведомлений, виджет выглядит нормально, но он никогда не обновляется снова. Мне нужно удалить виджет из центра уведомлений и добавить его снова. После этого виджет работает в течение дня, а затем снова перестает работать.
Чтобы увидеть, что делает виджет, я добавил простой белый вид со статусным текстом над табличным представлением при загрузке данных в "widgetPerformUpdateWithCompletionHandler" , чтобы увидеть, делает ли виджет что-либо. Белый вид появляется, когда виджет работает. Когда он не работает, вид состояния не отображается. Поэтому я думаю, что метод "widgetPerformUpdateWithCompletionHandler" не вызывается после того, как виджет активен в центре уведомлений некоторое время.
Я не знаю, что заставляет виджет перестать работать. Любые идеи?
Ответы
Ответ 1
У меня такая же проблема, и я разрешил ее, позвонив completionHandler(NCUpdateResultNoData);
сразу после вашего сетевого запроса, даже если ответ не был возвращен. Я обнаружил, что если обработчик завершения не называется widgetPerformUpdateWithCompletionHandler
больше не будет вызываться, и поэтому обновлений больше не будет. Также убедитесь, что вы вызываете обработчик завершения во всех ветвях после возврата запроса запроса.
Ответ 2
Как уже упоминалось, это вызвано тем, что ранее не был вызван completionHandler
после того, как был вызван widgetPerformUpdateWithCompletionHandler
. Вы должны убедиться, что completionHandler
вызывается независимо от того, что.
Способ, которым я предлагаю обработать это, заключается в сохранении completeHandler как переменной экземпляра, а затем вызывает его с ошибкой в viewDidDisappear:
@property(nonatomic, copy) void (^completionHandler)(NCUpdateResult);
@property(nonatomic) BOOL hasSignaled;
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
self.completionHandler = completionHandler;
// Do work.
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
if (!self.hasSignaled) [self signalComplete:NCUpdateResultFailed];
}
- (void)signalComplete:(NCUpdateResult)updateResult {
NSLog(@"Signaling complete: %lu", updateResult);
self.hasSignaled = YES;
if (self.completionHandler) self.completionHandler(updateResult);
}
Ответ 3
Дополнительная проблема заключается в том, что после вызова widgetPerformUpdateWithCompletionHandler:
, вызываемого, никогда не будет другого обработчика завершения вызова. Я еще не нашел способ снова вызвать системный вызов widgetPerformUpdateWithCompletionHandler:
. Поэтому убедитесь, что ваш виджет также попытается перезагрузить данные через viewWillAppear:
в качестве резервной копии, или некоторые пользователи могут застревать с незагружаемым виджетами.
Ответ 4
Вызов завершающего Handler с помощью NCUpdateResultNewData внутри widgetPerformUpdateWithCompletionHandler до того, как асинхронный вызов вернется и снова вызовет его с помощью NCUpdateResultNewData или NCUpdateResultFailed, похоже, работает.