¿Cómo trabajar con cargas de files grandes en ios?

Mi aplicación requiere la carga de files de video del teléfono de los usuarios, que luego se procesarán en el server. El problema es el tamaño del file puede ir a más de 200 MB y el usuario no mantendrá abierta la aplicación para esperar a que el file se cargue. Dado que Apple no permite que las aplicaciones se ejecuten en segundo plano durante más de un time limitado. ¿Cómo puedo asegurarme de que mis files se carguen? Estoy usando afnetworking para configurar una tarea de carga como la que da la biblioteca ios 7.

Por favor, si alguien puede señalarme en la dirección correcta o tener alguna solución, sería muy apreciado. He golpeado mi cabeza con esto durante demasiado time. Gracias.

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session,NSURLSessionTask *task ,int64_t bytesSent, int64_t totalBytesSent,int64_t totalBytesExpectedToSend){ CGFloat progress = ((CGFloat)totalBytesSent / (CGFloat)sensize); NSLog(@"Uploading files %lld -- > %lld",totalBytesSent,totalBytesExpectedToSend); [self.delegate showingProgress:progress forIndex:ind]; }]; dataTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error: %@", error); } else { } }]; 

Mi request es una request normal de formularios multiparte.

Utilizar:

 NSURLSessionConfiguration:backgroundSessionConfiguration: 

en lugar de

 NSURLSessionConfiguration:defaultSessionConfiguration 

Desde NSURLSessionConfiguration:backgroundSessionConfiguration: documentation :

Las tareas de carga y descarga en sesiones de background las realiza un daemon externo en lugar de la propia aplicación. Como resultado, las transferencias continúan en segundo plano incluso si la aplicación se suspende, sale o se cuelga.

Entonces, en tu caso, cambia:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

a:

 NSString *appID = [[NSBundle mainBundle] bundleIdentifier]; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID]; 

Implementación de la application:handleEventsForBackgroundURLSession:completionHandler: en su aplicación, el delegado permitirá que su aplicación se despierte (es decir, no suspendido o no finalizado en modo de background) cuando se haya completado una carga (si se completó correctamente o no).

No te confundas con la búsqueda de background. No lo necesitas. Background Fetching simplemente le despierta la aplicación periódicamente para darle a su aplicación la oportunidad de get pequeñas cantidades de contenido con regularidad. Sin embargo, puede ser útil para reiniciar las subidas fallidas de "modo de background" periódicamente.

En su lugar, debe utilizar una configuration de session en segundo plano si la configuration de una session pnetworkingeterminada . Esto garantiza que su transferencia de datos continuará en segundo plano una vez que el usuario haya salido de su aplicación.

Por supuesto, esto es correcto siempre que el usuario tenga habilitado el background para su aplicación en la aplicación Configuración del dispositivo.

Asegúrese de habilitar la capacidad de búsqueda de background en la configuration de su proyecto:

Capacidades http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa02.png

Fondo de búsqueda http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa03.png

Luego, ejecute la application:handleEventsForBackgroundURLSession:completionHandler: en su Delegado de aplicaciones para recibir información cuando finalice la transferencia de datos y haga lo que necesite hacer (actualización UI …) dentro de su aplicación con el file recibido / enviado. No olvide llamar a completionHandler para informar al sistema que ha finalizado sus tareas. iOS luego tomará una captura de pantalla de la pantalla activa de su aplicación y actualizará la que aparece en la pantalla de multitarea de iOS 7.