Подтвердить что ты не робот

IOS 8 сегодня виджет перестает работать через некоторое время

Я сделал сегодня виджет для немецкой хоккейной лиги DEL.

Я загружаю следующие игры с нашего сервера и показываю их в tableView. Процесс загрузки запускается в предлагаемом методе "widgetPerformUpdateWithCompletionHandler" . Вначале я загружаю некоторые кэшированные данные в "viewWillAppear".

Все отлично работает до сих пор!

Screenshot of the working widget.

Но через некоторое время (один день) виджет перестает работать. Когда я открываю центр уведомлений, виджет выглядит нормально, но он никогда не обновляется снова. Мне нужно удалить виджет из центра уведомлений и добавить его снова. После этого виджет работает в течение дня, а затем снова перестает работать.

Чтобы увидеть, что делает виджет, я добавил простой белый вид со статусным текстом над табличным представлением при загрузке данных в "widgetPerformUpdateWithCompletionHandler" , чтобы увидеть, делает ли виджет что-либо. Белый вид появляется, когда виджет работает. Когда он не работает, вид состояния не отображается. Поэтому я думаю, что метод "widgetPerformUpdateWithCompletionHandler" не вызывается после того, как виджет активен в центре уведомлений некоторое время.

Я не знаю, что заставляет виджет перестать работать. Любые идеи?

4b9b3361

Ответ 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, похоже, работает.