Enlace de carga de la sesión de fondo

¿

Descripción simplificada del problema

alguien ha enlazado con éxito la nsurlsession Background upload?
Estoy tratando de subir un enorme archivo de vídeo de 5 MB usando la carga de fondo de nsurlsession. La carga debe ser ordenada. Todo el sistema funciona bien en primer plano. Estoy usando afnethawking, que es una carga multi - parte. Sin embargo, cuando la aplicación se encuentra en el Fondo, el primer proyecto se puede cargar correctamente y el segundo proyecto se inicia en el Fondo (en el setdidfinishevents For background urlsession Block del gestor de Seguridad). Pero se detuvo repentinamente (mi mejor conjetura es que después de 30 segundos, porque el ciclo de vida más largo de la aplicación que se despierta en el Fondo es de 30 segundos), y luego no pasó nada. Esperaba que la segunda lección terminara en el Fondo y llamara a la tercera etc - - un acto de vinculación, pero eso no parecía funcionar.
He intentado a ñadir todas las partes del archivo a una nsurlsession a la vez usando http maximum Connections perhost = 1 - que es bueno para cargar el archivo completo en partes. Pero la parte del archivo se selecciona en orden aleatorio, es decir, la parte 1 se carga, y luego la parte 5, la parte 3, la parte 10, etc... Traté de a ñadirlo a una cola de operaciones, y las dependencias entre las operaciones parecían estropear todo - subir no funcionó en absoluto.
Sé que el archivo de vídeo se puede cargar como un archivo separado en el Fondo, pero el servidor quiere que esto sea parte de 5 MB. Por lo tanto, creo que mi única opción es subir enlaces o añadir todas las partes a la nsurlsession, pero asegúrese de que siempre se cargan en el orden en que se añaden.
Cualquier ayuda será apreciada.
Mi código:
 - (void)viewDidLoad {

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"%d", rand()]];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config];
    config.HTTPMaximumConnectionsPerHost = 1;
    [manager setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession *session) {

        dispatch_async(dispatch_get_main_queue(), ^{
            // Call the completion handler to tell the system that there are no other background transfers.
            //                completionHandler();
            [self upload];
        });
    }];
}

- (IBAction)start:(id)sender {

    [self upload];
}

-(void) upload {

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"mp4"];
    AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];

    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@"234", @"u", @"Sample.mp4", @"f",nil];
    NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:@"data" fileName:@"Sample.mp4" mimeType:@"video/mp4" error:nil];
    } error:nil];


    __block NSString *tempMultipartFile = [NSTemporaryDirectory() stringByAppendingPathComponent:@"Test"];
    tempMultipartFile = [tempMultipartFile stringByAppendingString:[NSString stringWithFormat:@"%d", rand()]];
    NSURL *filePathtemp = [NSURL fileURLWithPath:tempMultipartFile];
    __block NSProgress *progress = nil;
    [serializer requestWithMultipartFormRequest:request writingStreamContentsToFile:filePathtemp completionHandler:^(NSError *error) {
        NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePathtemp progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {

            NSLog(@"Request--> %@.\n Response --> %@ \n%@",  request.URL.absoluteString ,responseObject, error? [NSString stringWithFormat:@" with error: %@", [error localizedDescription]] : @""); //Lets us know the result including failures
            [[NSFileManager defaultManager] removeItemAtPath:tempMultipartFile error:nil];

        }];
        [uploadTask resume];
        [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session, NSURLSessionTask *task, int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {

            NSLog(@"uploading");
        }];
    }];
}

La mejor solución

bien, finalmente me puse en contacto con Apple para aclarar el problema de la carga de fondo del enlace - que no es posible en Ios. Nsurlsession tiene un limitador de velocidad de recuperación que impide que la aplicación realice tareas de enlace en el Fondo, como se describe en https://forums.developer.apple.com/thread/14854. En su lugar, Apple recomienda transferencias por lotes u otras opciones, como https://forums.developer.apple.com/thread/14853. Otra cosa que pedí fue ordenar varias tareas en la cola de carga, obligando a la nsurlsession a cargar tareas en el orden en que se agregaron. Como se señala en dgatwood, el uso de la cola de nsoperation es imposible, y Apple también lo mencionó. Como se mencionó en eskimo en el correo de respuesta, "nsurlsession no garantiza que su solicitud se ejecute secuencialmente y no puede ser ejecutada."Así que en mi pregunta inicial, tenía pocas opciones.