iOS Background descargas cuando la aplicación no está activa

Cuando mi aplicación se descarga inicialmente, el usuario necesita descargar un archivo grande, como 200 MB (límite superior). Definitivamente no puedo esperar que el usuario mantenga la aplicación abierta hasta que se descargue este archivo. Entonces él / ella podría cerrar la aplicación y la aplicación pasará a segundo plano.

¿Cómo puedo continuar descargando el archivo en este escenario? ¿Es esto posible en iOS?

Es posible comenzar una tarea en segundo plano cuando comienza la descarga:

Las aplicaciones que están en transición a segundo plano pueden solicitar una cantidad de tiempo adicional para finalizar cualquier tarea importante de última hora.

Ejecutar una tarea de longitud finita en el fondo

Sin embargo, dicha tarea está limitada a una cantidad indefinida de tiempo de ejecución por parte del sistema. Sin embargo, una descarga de archivos de 200Mb puede ser una tarea demasiado grande en este caso.

Agregue a continuación en su - (void)applicationDidEnterBackground:(UIApplication *)application

 UIApplication *app = [UIApplication sharedApplication]; UIBackgroundTaskIdentifier bgTask; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; }]; 

y eres bueno para ir … Lo tengo en una de mis aplicaciones de administrador de descargas publicadas

Esto funcionará bien. También puede verificar cuánto tiempo tiene, ya que Apple solo habilita tareas de fondo de 10 minutos. Utilizar:

 NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining]; NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug 

En una de mis aplicaciones, estaba cargando una gran cantidad de datos. Definitivamente no puedo esperar que el usuario mantenga la aplicación en primer plano hasta que se descarguen los datos. Solo uso el siguiente código para descargar los datos mientras la aplicación está en segundo plano. Está funcionando correctamente 🙂
Por favor, sigue los siguientes pasos:

1) use la siguiente línea en el archivo de encabezado de ViewController

  @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 

síntesis en archivo .m.

2) en ViewDidLoad asigna UIBackgroundTaskIdentifier como:

  self.backgroundTask = UIBackgroundTaskInvalid; 

3) Use la siguiente línea de código, aquí solo estoy manteniendo el método getDataFromServer dentro de beginBackgroundTaskWithExpirationHandler: block.

  self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; }]; /* Here your downloading Code, let say getDataFromServer method */ [self getDataFromServer]; // Its dummy method /* Your downloading Code End Here */ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; self.backgroundTask = UIBackgroundTaskInvalid; }); 

4) Si desea verificar el tiempo restante para descargar datos en segundo plano, incluya la siguiente línea en ApplicationDidEnterBackground: (UIApplication *), el método de delegado de la aplicación de AppDelegate:

  NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining); 

Podría usar NSURLSession introducido en iOS 7.0 y posterior para continuar la carga / descarga de un archivo incluso cuando la aplicación se suspende.

Documentación de Apple

La clase NSURLSession y las clases relacionadas proporcionan una API para descargar contenido. Esta API proporciona un amplio conjunto de métodos delegates para admitir la autenticación y le da a su aplicación la capacidad de realizar descargas en segundo plano cuando su aplicación no se está ejecutando o, en iOS, mientras se suspende su aplicación.

Y

Las sesiones en segundo plano le permiten realizar cargas y descargas de contenido en segundo plano mientras su aplicación no se está ejecutando. Puede crear una configuración de sesión en segundo plano llamando al método backgroundSessionConfiguration : en la clase NSURLSessionConfiguration.

Un buen tutorial para usar NSURLSession en este enlace .

AFNetworking le permite realizar operaciones pesadas en segundo plano.

AFNetworking Library es una excelente combinación de NSURLConnection y NSOperationQueue. Esta biblioteca se utiliza para la descarga asíncrona en segundo plano que no afecta a la otra aplicación.

AFNetworking le permite manejar la descarga con ExpirationHandle, es decir, si de alguna manera durante la descarga se pierde la conexión, se conectará de nuevo.

Fuente de la biblioteca para AFNetworking

Fuente de referencia AFNetworking funciona en segundo plano

Apple Reference Link Apple

Ejecución de fondo y Apple multitarea

 #pragma mark - View Loading handling - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; } #pragma mark - Background handling when application goes background UIBackgroundTaskIdentifier background_task; - (void)appDidEnterBackground:(NSNotification *)notification { UIApplication *application = [UIApplication sharedApplication]; if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { NSLog(@"Multitasking Supported"); if (background_task == UIBackgroundTaskInvalid) { background_task = [application beginBackgroundTaskWithExpirationHandler:^ { NSLog(@"Background task expiration\n"); //Clean up code. Tell the system that we are done. [application endBackgroundTask: background_task]; background_task = UIBackgroundTaskInvalid; }]; //To make the code block asynchronous dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //### background task starts NSLog(@"Running in the background\n"); for(int cnt=0; cnt<10; cnt++) //while(TRUE) { NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]); [NSThread sleepForTimeInterval:1]; //wait for 1 sec } //#### background task ends //Clean up code. Tell the system that we are done. NSLog(@"here you can do something before it really enters background"); [NSThread sleepForTimeInterval:1]; //wait for 1 sec [application endBackgroundTask: background_task]; background_task = UIBackgroundTaskInvalid; }); } else { NSLog(@"Multitasking Not Supported"); } } } 

Puedes saber más de esta diapositiva .
Acabo de hacer algunas modificaciones simples útiles del fragmento de esta diapositiva. Espero que esto ayude.

Cree una aplicación newsStand para iOS; no es una aplicación de iOS estándar.

Aplicaciones Standart iOS:

  • no puede descargar datos cuando está cerrado.
  • puede descargar datos en tiempo limitado cuando se lo coloca en segundo plano.
  • No hay tiempo suficiente para descargar 200mb.

Las aplicaciones de NewsStand tienen un privilegio de tiempo extra para descargar cuando están cerradas o inBackground. Una vez cada 24 horas, tienen el privilegio de responder a una llamada de delegado RemoteContentReady.

Crear una aplicación newsStand no es diferente a construir una aplicación estándar de iOS. Simplemente lo marcará como la aplicación newStand.

Entonces tendrá privilegios para ejecutar el código que está dentro de la delegación remoteContentReady.

Para recibir la señal RemoteContentReady, debe enviar una señal desde su servidor (c #, php, bla bla).

No a todas las aplicaciones de iOS. Algo así como una señal de notificación remota. Es posible que necesite la certificación SSL para su sitio web con el fin de lograr esto.

Atentamente