Estoy probando la nueva fantasía de iOS 7 fondo de subir usando NSURLSessionUploadTask y parece que funciona cuando corro con defaultSessionConfiguration, pero una vez lo intente backgroundSessionConfiguration se bloquea en la línea donde puedo llamar uploadTaskWithRequest:

Aquí está el código que se muestra a continuación. Curiosamente, mientras que hay una miríada de downloadTaskWithRequest ejemplos en línea, no puedo encontrar una sola que combina fondo y subir juntos.

//Create a session w/background settings
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"identifierString.foo"];
NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

//Create a file to upload
UIImage *image = [UIImage imageNamed:@"[email protected]"];
NSData *imageData = UIImagePNGRepresentation(image);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *URLs = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSString *documentsDirectory = [[URLs objectAtIndex:0] absoluteString];
NSString *filePath = [documentsDirectory stringByAppendingString:@"testfile.png"];
[imageData writeToFile:filePath atomically:YES];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://file.upload/destination"]];
[request setHTTPMethod:@"PUT"];
NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:[NSURL URLWithString:filePath] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    //code
}];

[uploadTask resume];

Este código se bloquea en la línea con uploadTaskWithRequest: … justo antes de que llegue al currículum de línea al final.

Curiosamente, esto parece funcionar bien cuando uso cualquier config tipo distinto de backgroundSessionConfiguration. Se necesita ayuda!

Gracias de antemano.

InformationsquelleAutor Dinkman123 | 2014-02-13

2 Comentarios

  1. 15

    Bien, así que este era una especie de justo que yo sea tonto y no exhaustiva aquí:

    1) me gustaría establecer una excepción de punto de interrupción para obtener la traza de que se me impide ver la verdadera excepción de error de impresión — uy.

    2) no se Puede utilizar la versión de uploadTaskWithRequest que tiene una terminación de devolución de llamada para un backgroundSessionConfiguration (no es sorprendente, pero todavía no está bien documentado).

    3) Escriba sus datos PNG en el directorio /var/… y proporcionar a uploadTaskWithRequest con file:///var/… (esto es solo torpe, porque no es a menudo necesario para convertir entre los dos para una sola secuencia de comandos)

    Feliz de poner un NSUrlSessionUploadTask código de ejemplo aquí, ya que parece que hay cero de ellos en toda la interwebs. LMK si alguien quiere que.

    • Usted debe marcar esto como la respuesta correcta.
    • +1, Gracias por tus consejos, estoy atascado en la misma tarea,publicado mi pregunta here pero no obtuvo ninguna respuesta satisfactoria, por favor, puedes poner tu código de ejemplo?
    • Te tengo. Véase la respuesta que acaba de publicar.
    • Exactamente los mismos errores con los que me encontré. Escribí un post en el blog porque hay mucha falta de información sobre esta característica. medium.com/@KyleRStewart/zombie-uploads-with-ios-dd3b1f6b66
    • puede usted responder a esta stackoverflow.com/questions/25311736/…
    • Estoy atascado en el mismo tema con usted. podría publicar código de ejemplo aquí? El enlace que publicó la respuesta no está funcionando. gracias

  2. 7

    Conforme a lo solicitado, de fondo la carga de ejemplo. Asegúrese de implementar NSURLSessionDelegate y NSURLSessionTaskDelegate como sea necesario.

    NSMutableArray *unsentPhotos = (NSMutableArray*)[sendingMessage objectForKey:@"unsentPhotos"];
    TMessage *message = (TMessage*)[sendingMessage objectForKey:@"message"];
    message.sendStatus = MS_PENDING_IMAGE_UPLOAD;
    for (int i = 0; i < [unsentPhotos count]; i++) {
    NSString *fileName = [unsentPhotos objectAtIndex:i];
    NSLog(@"Initiating file upload for image %@", fileName);
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *srcImagePath = [NSString stringWithFormat:@"%@/messageCache/%@", [paths objectAtIndex:0], fileName];
    NSString *dataSrcImagePath = [srcImagePath stringByAppendingString:@".tmp"];
    //Encode file to data
    NSData *imageData = [NSData dataWithContentsOfFile:srcImagePath];
    if (!([imageData writeToFile:dataSrcImagePath atomically:YES])) {
    NSLog(@"Failed to save file.");
    }
    //Prepare upload request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://blah.com"]];
    [request setHTTPMethod:@"PUT"];
    [request setValue:globalAPIToken forHTTPHeaderField:@"access_token"];
    [request setValue:[AppDelegate getMyUserID] forHTTPHeaderField:@"userid"];
    [request setValue:[NSString stringWithFormat:@"%d", message.teamID] forHTTPHeaderField:@"teamId"];
    [request setValue:[NSString stringWithFormat:@"%d", message.emailID] forHTTPHeaderField:@"messageId"];
    [request setValue:fileName forHTTPHeaderField:@"fileName"];
    [request setValue:@"1" forHTTPHeaderField:@"basefile"];
    if (i == 0) {
    //If this is the first upload in this batch, set up a new session
    //Each background session needs a unique ID, so get a random number
    NSInteger randomNumber = arc4random() % 1000000;
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration: [NSString stringWithFormat:@"testSession.foo.%d", randomNumber]];
    config.HTTPMaximumConnectionsPerHost = 1;
    session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    //Set the session ID in the sending message structure so we can retrieve it from the
    //delegate methods later
    [sendingMessage setValue:session.configuration.identifier forKey:@"sessionId"];
    }
    uploadTask = [session uploadTaskWithRequest:request fromFile:[NSURL URLWithString:[NSString stringWithFormat:@"file://%@", dataSrcImagePath]]];
    [uploadTask resume];
    }
    • Usted probablemente querrás evitar la creación de la solicitud si la escritura a disco que ha fallado.
    • Utilice NSURL fileURLWithPath para agregar el archivo:// para que en lugar de codificar con un stringWithFormat. Así se vería esto en su lugar: uploadTask = [sesión uploadTaskWithRequest:solicitud de fromFile:[NSURL fileURLWithPath:dataSrcImagePath];

Dejar respuesta

Please enter your comment!
Please enter your name here