extension - iOS 8 widget de hoy deja de funcionar después de un tiempo
cual es la extensión de ios (4)
Como han mencionado otros, esto se debe a que no se ha llamado previamente a completionHandler
después de que se haya llamado widgetPerformUpdateWithCompletionHandler
. Debes asegurarte de que se llame a completionHandler
sin importar qué .
La forma en que sugiero que manejemos esto es guardando el controlador de completador como una variable de instancia, y luego llamándolo con error en 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);
}
He hecho un widget de hoy para la liga alemana de hockey sobre hielo DEL.
Estoy cargando los próximos juegos de nuestro servidor y mostrarlos en una tableView. El proceso de carga se inicia en el método propuesto "widgetPerformUpdateWithCompletionHandler". Inicialmente estoy cargando algunos datos en caché en "viewWillAppear".
¡Todo funciona muy bien hasta ahora!
Pero después de un tiempo (un día) el widget deja de funcionar. Cuando abro el centro de notificaciones, el widget parece normal, pero nunca se actualiza de nuevo. Tengo que eliminar el widget del centro de notificaciones y volver a agregarlo. Después de eso, el widget funciona durante un día y luego nuevamente deja de funcionar.
Para ver qué está haciendo el widget, agregué una vista blanca simple con un texto de estado sobre la vista de tabla mientras cargaba los datos en "widgetPerformUpdateWithCompletionHandler" para ver si el widget está haciendo algo. La vista blanca aparece cuando el widget está funcionando. Cuando no está funcionando, la vista de estado no aparece. Así que creo que no se llama al método "widgetPerformUpdateWithCompletionHandler" después de que el widget esté activo en el centro de notificaciones por un tiempo.
No tengo ni idea de qué hace que el widget deje de funcionar. ¿Algunas ideas?
Llamar a completedHandler con NCUpdateResultNewData dentro de widgetPerformUpdateWithCompletionHandler antes de que vuelva una llamada asíncrona y lo vuelva a llamar con NCUpdateResultNewData o NCUpdateResultFailed parece funcionar.
Un problema adicional es que una vez que se deja de llamar widgetPerformUpdateWithCompletionHandler:
nunca habrá otro controlador de finalización al que llamar. No he encontrado una manera de hacer que el sistema llame widgetPerformUpdateWithCompletionHandler:
otra vez. Por lo tanto, asegúrese de que su widget también intentará volver a cargar los datos a través de viewWillAppear:
como alternativa, o algunos usuarios podrían quedarse atascados con un widget sin carga.
Tengo el mismo problema y lo resolví llamando a completionHandler(NCUpdateResultNoData);
justo después de su solicitud de red, incluso cuando la respuesta no ha sido devuelta. Descubrí que si el controlador de finalización no se llama widgetPerformUpdateWithCompletionHandler
ya no se invocará y, por lo tanto, no habrá más actualizaciones. También asegúrese de llamar al controlador de finalización en todas las sucursales después de que devuelva su solicitud de llamada.