Después de leer la documentación de Apple acerca de la descarga en segundo plano con el nuevo iOS7 api (NSURLSession), estoy un poco decepcionado. Yo estaba seguro de que Apple fue la gestión de la pausa/reanudar sobre la disponibilidad de la red en el fondo (o proporcionar una opción para hacerlo), pero no…

Para la lectura de la documentación, esto es lo que tenemos:

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

Cuando la tarea se completa, el NSURLSession objeto de llamadas de la
delegado del URLSession:tarea:didCompleteWithError: método, ya sea con un
objeto de error, o nil si la tarea se completó correctamente.
Si la tarea es una reanudación de la tarea de descarga, el NSError del objeto userInfo diccionario
contiene un valor para el NSURLSessionDownloadTaskResumeData clave. Su
la aplicación debe utilizar la accesibilidad de la Api para determinar cuando para volver a intentarlo, y
debe entonces llamar a downloadTaskWithResumeData: o
downloadTaskWithResumeData:completionHandler: para crear una nueva descarga
tarea, la de que descargar. Vaya al paso 3 (la creación y la reanudación de la
la tarea de los objetos).

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

De mi lado yo estoy usando la accesibilidad y cada vez que la red está disponible, yo reanudar todas las tareas (se hace referencia a más de un NSArray a la hora de crear), y suspende cuando la red se pierde. Esto funciona bien en el primer plano, pero en el fondo necesito ayuda en los siguientes puntos:

  • Si mi aplicación no tiene conectividad en primer plano, si voy a un segundo plano y sin conectividad de todas mis tareas sigue suspendido y no volvió si la red está disponible…

  • Perder de red en el fondo, dejar todas mis descargas/tareas.
    Escenario:

    • En primer plano, puedo empezar a descargar mis tareas
    • Me vaya a fondo y después de 10s interruptor a la posición «aireplan modo de»
    • Todas mis tareas de un error. Así, en el método URLSession:tarea:didCompleteWithError: puedo volver a ellos mediante
      downloadTaskWithResumeData o si no puedo (porque algunos no han
      suficiente curriculum vitae datos) estoy creando una nueva tarea sin curriculum vitae ing (excepto si la red está de vuelta en ese momento).
    • Luego puse el wifi
    • Como todavía estoy en el fondo no puedo activar un «curriculum vitae» cuando la red está de vuelta sin necesidad de iniciar la aplicación…

¿Cómo abordar estos puntos? He perdido de algo?

  • Comparto tu decepción. Usted mencionó que están a la espera de una respuesta de Apple en este. ¿Has oído hablar de ellos? ¿Qué es la resolución?
  • Tengo mucho de intercambio con Apple, pero no era productivo, la recomendación es el uso discrecional de la bandera que se debe tener el cuidado de las tesis de los casos (pero sin garantías de resultados en el tiempo). De este modo no era mi objetivo, yo no se centran mucho en esto, pero mi prueba no fue exitosa. Si se ha probado sobre esta parte, que sería interesante para obtener información.

3 Comentarios

  1. 3

    Como todavía estoy en el fondo no puedo activar un «curriculum vitae» cuando la red está de vuelta sin necesidad de iniciar la aplicación…


    puede utilizar el fondo de «fetch»,cuando la aplicación se inicia por recuperar,a continuación, puede ver la red y reanudar la tarea de descarga.

    • Esto podría ser una solución… Esperando una respuesta de Apple a la derecha ahora.
    • ¿tener una respuesta de Apple al respecto? Estoy teniendo el mismo problema.
    • Cualquier palabra sobre esto?
    • No obtuve respuestas útiles finalmente
  2. 2

    Debe crear el NSURLSession con el fondo de las configuraciones, haga su tarea se envía a un segundo plano demonio y su aplicación se llama cuando se haya completado.

  3. 2

    De ejecución:

    application:handleEventsForBackgroundURLSession:completionHandler:

    en la aplicación de delegados, sin llamar a la completionHandler – hace que la aplicación se cuelgue alrededor en el fondo después de que el dispositivo pierde su conexión al mismo tiempo suspendido. De esa manera, la aplicación todavía se puede escuchar a la accesibilidad de las notificaciones y reiniciar la descarga cuando una conexión de red esté disponible de nuevo. Sin embargo, este es un muy chunga enfoque y no puede pasar la app store de Apple pautas de presentación. Además, este enfoque no es de mucha ayuda cuando se pierde la conexión mientras la aplicación está en primer plano y la conexión recuperado, mientras que la aplicación está suspendida.

    Al final hice lo siguiente:

    • Hizo uso de la application:handleEventsForBackgroundURLSession:completionHandler: notificación para pausar mis descargas en segundo plano.
    • Hecho uso de los intermitentes fondo búsqueda de notificación (es decir. application:performFetchWithCompletionHandler:completionHandler) para comprobar el estado de la conexión y reiniciar las descargas en pausa. (sombrero de punta de @gugupluto)

    Esto no proporcionar un óptimo rendimiento de descarga y puede llevar a los usuarios a preguntarse por qué sus «antecedentes » descargar» no se ha terminado de una vez que vuelva a abrir la aplicación, pero parece ser la mejor que se puede esperar de Apple por ahora.

    • Como puedo decirle a la aplicación se le da una cierta cantidad de tiempo (alrededor de 30 segundos) para invocar el controlador de finalización pasado y si no lo hace, a continuación, va a ser asesinado por un vigilante, excepto cuando se está depurando es decir, lanza a través de Xcode, que puede hacer que algunos desarrolladores piensan ignorando el controlador de finalización es una solución válida cuando no lo es.
    • Eso tendría sentido, pero esto no era lo que yo estaba presenciando cuando lo probé en mi iPad 4th gen. La aplicación apareció a permanecer en segundo plano de forma indefinida, y respondió a la accesibilidad de la red de notificaciones.

Dejar respuesta

Please enter your comment!
Please enter your name here