Uploads using backgroundSessionConfiguration and NSURLSessionUploadTask cause app to crash

后端 未结 2 1914
离开以前
离开以前 2020-12-05 22:46

I\'m trying out the new fancy iOS 7 background uploading using NSURLSessionUploadTask and it seems to work when I run with defaultSessionConfiguration, but once I try backgr

相关标签:
2条回答
  • 2020-12-05 23:05

    Okay, so this was kind of just me being foolish and not thorough here:

    1) I'd set an exception breakpoint to get stack traces that was preventing me from see the actual exception error printout -- oops.

    2) Can't use version of uploadTaskWithRequest that has a completion callback for a backgroundSessionConfiguration (not surprising but still not well documented).

    3) Write your PNG data to /var/... and provide it to uploadTaskWithRequest with file:///var/... (this is just awkward because you don't often need to convert between the two for a single sequence of commands)

    Happy to put up a NSUrlSessionUploadTask sample code here, since there seems to be zero of them on the entire interwebs. LMK if anyone wants that.

    0 讨论(0)
  • 2020-12-05 23:19

    As requested, background uploading example. Be sure to implement NSURLSessionDelegate and NSURLSessionTaskDelegate as needed.

    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];
    }
    
    0 讨论(0)
提交回复
热议问题