ios ios7 nsurlsession

ios - Descarga de fondo de NSURLSession: reanudación en caso de fallo de la red



ios7 (3)

Como todavía estoy en segundo plano, no puedo activar una "reanudación" cuando la red está de vuelta sin iniciar la aplicación ...

puede utilizar "búsqueda en segundo plano", cuando la aplicación se inicia con búsqueda, puede verificar la red y reanudar la tarea de descarga.

Después de leer la documentación de Apple sobre la descarga en segundo plano con la nueva API iOS7 (NSURLSession), estoy un poco decepcionado. Estaba seguro de que Apple estaba administrando la pausa / reanudación sobre la disponibilidad de la red en segundo plano (o proporcionaba una opción para hacerlo) pero no ...

Así que leyendo la documentación, esto es lo que tenemos:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

Cuando se completa cualquier tarea, el objeto NSURLSession llama al método URLSession: task: didCompleteWithError: del delegado con un objeto de error, o nil si la tarea se completó correctamente. Si la tarea es una tarea de descarga reanudable, el diccionario de información de usuario del objeto NSError contiene un valor para la clave NSURLSessionDownloadTaskResumeData. Su aplicación debe usar las API de accesibilidad para determinar cuándo debe volver a intentarlo, y luego debe llamar a downloadTaskWithResumeData: o downloadTaskWithResumeData: completedHandler: para crear una nueva tarea de descarga para continuar esa descarga. Vaya al paso 3 (crear y reanudar objetos de tareas).

Hasta el momento entiendo la solución, pero mi pregunta es: ¿Qué arquitectura es la mejor para manejar la pérdida de la red y reanudar la descarga en segundo plano?

Por mi parte, estoy usando la accesibilidad y cada vez que la red está disponible, reanudo todas las tareas (a las que se hace referencia en una NSArray al crear) y las suspende cuando se pierde la red. Esto funciona bien en primer plano, pero para el fondo necesito ayuda en los siguientes puntos:

  • Si mi aplicación no tiene conectividad en primer plano, si voy al fondo sin conectividad, todas mis tareas quedarán suspendidas y no volverán si la red está disponible ...

  • Perder la red en segundo plano, detener todas mis descargas / tareas. Guión:

    • En primer plano, comienzo a descargar mis tareas.
    • Pasé al fondo y después de 10 s cambié a "modo plano aéreo"
    • Todas mis tareas consiguieron un error. Así que en el método URLSession: task: didCompleteWithError: los reanudo usando downloadTaskWithResumeData o si no puedo (porque algunos no tienen suficientes datos de reanudación) estoy creando una nueva tarea sin reanudarla (excepto si la red está de vuelta en eso hora).
    • Luego pongo el wifi
    • Como todavía estoy en segundo plano, no puedo activar una "reanudación" cuando la red está de vuelta sin iniciar la aplicación ...

¿Cómo dirijo estos puntos? ¿Me he perdido algo?


Debe crear la NSURLSession con configuraciones en segundo plano, luego su tarea se envía a un demonio en segundo plano y se llama a su aplicación cuando se completa.


Implementar:

application:handleEventsForBackgroundURLSession:completionHandler:

en el delegado de la aplicación, sin llamar a completedHandler, la aplicación se queda en segundo plano después de que el dispositivo pierde su conexión mientras está suspendido. De esa manera, la aplicación aún puede escuchar las notificaciones de accesibilidad y reiniciar la descarga cuando una conexión de red esté disponible una vez más. Sin embargo, este es un enfoque bastante poco fiable y puede que no pase las pautas de envío de la tienda de aplicaciones de Apple. Además, este enfoque no es de mucha ayuda cuando la conexión se pierde mientras la aplicación está en primer plano y la conexión se recupera mientras la aplicación está suspendida.

Al final hice lo siguiente:

  • Uso de la application:handleEventsForBackgroundURLSession:completionHandler: notificación para pausar mis descargas en segundo plano.
  • Hice uso de la notificación de recuperación de fondo intermitente (es decir, application:performFetchWithCompletionHandler:completionHandler ) para verificar el estado de la conexión y reiniciar las descargas en pausa. (hat-tip @gugupluto)

Esto aún no proporciona un rendimiento de descarga óptimo y puede llevar a los usuarios a preguntarse por qué su "descarga de fondo" no ha terminado una vez que vuelven a abrir la aplicación, pero parece ser lo mejor que podemos esperar de Apple por ahora.