2015-10-21 86 views
0

我使用以下方式在后台上传文件。AFNetworking和后台传输服务:上传

问题是在文件上传后不会调用completionhandler。
(我可以确认文件确实上传到服务器端)

我在我的pod文件中有这个。

platform :ios, '7.0' 
pod 'AFNetworking', '~> 2.5' 

而且代码..

NSString* apiUrl = @"http://example.com/upload"; 

// Prepare a temporary file to store the multipart request prior to sending it to the server due to an alleged 
// bug in NSURLSessionTask. 
NSString* tmpFilename = [NSString stringWithFormat:@"%f", [NSDate timeIntervalSinceReferenceDate]]; 
NSURL* tmpFileUrl = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:tmpFilename]]; 

// Create a multipart form request. 
NSMutableURLRequest *multipartRequest = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" 
                            URLString:apiUrl 
                            parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
             { 
              [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] 
                     name:@"file" 
                    fileName:fileName 
                    mimeType:@"image/jpeg" error:nil]; 
             } error:nil]; 

// Dump multipart request into the temporary file. 
[[AFHTTPRequestSerializer serializer] requestWithMultipartFormRequest:multipartRequest 
              writingStreamContentsToFile:tmpFileUrl 
                completionHandler:^(NSError *error) { 
                 // Once the multipart form is serialized into a temporary file, we can initialize 
                 // the actual HTTP request using session manager. 

                 // Create default session manager. 
                 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

                 // Show progress. 
                 NSProgress *progress = nil; 
                 // Here note that we are submitting the initial multipart request. We are, however, 
                 // forcing the body stream to be read from the temporary file. 
                 NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:multipartRequest 
                                fromFile:tmpFileUrl 
                                progress:&progress 
                              completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) 
                           { 
                            // Cleanup: remove temporary file. 
                            [[NSFileManager defaultManager] removeItemAtURL:tmpFileUrl error:nil]; 

                            // Do something with the result. 
                            if (error) { 
                             NSLog(@"Error: %@", error); 
                            } else { 
                             NSLog(@"Success: %@", responseObject); 
                            } 
                           }]; 

                 // Add the observer monitoring the upload progress. 
                 [progress addObserver:self 
                    forKeyPath:@"fractionCompleted" 
                     options:NSKeyValueObservingOptionNew 
                     context:NULL]; 

                 // Start the file upload. 
                 [uploadTask resume]; 
                }]; 

最后completionhandler,我删除临时文件不叫。

回答

0

此,init是默认会话:

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

有关背景会话,你应该使用:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:kBackgroundSessionId]; 
相关问题