我有一个应用程序可以上传TSPhoto对象数组中的几张图片。
当我开始上传时,委托方法最终会说它完成了,但应用程序从未到达服务器而且Instruments没有显示网络流量 :< / p>
_session = [self backgroundSession];
for(TSPhoto *photo in _picsetPhotos) {
NSURL *uploadURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@upload", @"https://example.com/"]];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:uploadURL];
[req setHTTPMethod:@"POST"];
NSLog(@"req dump: %@", req);
// Add it to the queue
NSURLSessionUploadTask *uploadTask = [_session uploadTaskWithRequest:req fromFile:[NSURL fileURLWithPath:photo.fullImagePath]];
// "Start" it
NSLog(@"Enqueueing %@", uploadTask);
[uploadTask resume];
NSLog(@"Post-resume");
}
-backgroundSession:
-(NSURLSession *)backgroundSession {
static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"TSBackgroundUploader"];
configuration.HTTPMaximumConnectionsPerHost = 1;
session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
});
return session;
}
我已经实现了所有适当的委托方法:
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session {
NSLog(@"Finished all uploads!");
[[[UIAlertView alloc] initWithTitle:@"Upload Completed" message:@"Your album has been created." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
dispatch_async(dispatch_get_main_queue(), ^{
[_uploadProgress setProgress:
(double)totalBytesSent /
(double)totalBytesExpectedToSend animated:YES];
});
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[_uploadProgress setProgress:0.5];
// Did we succeed?
if(!error) {
NSLog(@"Upload done");
} else {
NSLog(@"%@", error.description);
}
});
进度条在所有这些过程中也表现得非常不稳定,上升和下降直到最终达到100。
有什么可能发生的线索?
修改
这是我添加更多NSLog
语句后的日志。任务以与启动它们相反的顺序调用委托:
2015-05-04 09:55:42.492 TS[348:95052] Starting background upload
2015-05-04 09:55:42.493 TS[348:95052] req dump: <NSMutableURLRequest: 0x1740138b0> { URL: https://example.com/upload }
2015-05-04 09:55:42.512 TS[348:95052] Enqueueing <__NSCFBackgroundUploadTask: 0x155d804c0>{ taskIdentifier: 3 }
2015-05-04 09:55:42.513 TS[348:95052] Post-resume
2015-05-04 09:55:42.513 TS[348:95052] req dump: <NSMutableURLRequest: 0x17400de00> { URL: https://example.com/upload }
2015-05-04 09:55:42.524 TS[348:95052] Enqueueing <__NSCFBackgroundUploadTask: 0x155e68db0>{ taskIdentifier: 4 }
2015-05-04 09:55:42.525 TS[348:95052] Post-resume
2015-05-04 09:56:01.726 TS[348:95052] ID: 4
2015-05-04 09:56:01.726 TS[348:95052] Upload done
2015-05-04 09:56:02.920 TS[348:95052] ID: 3
2015-05-04 09:56:02.920 TS[348:95052] Upload done
答案 0 :(得分:1)
您没有看到任何网络活动,因为后台会话在由系统管理的单独守护程序上传输数据。
这是Apple文档的摘录:
&#34;配置完成后,您的NSURLSession对象无缝 会在适当的时间将上传和下载任务移交给系统。如果任务在您的应用程序仍在运行时(在前台或后台)完成,则会话对象将以通常的方式通知其委托。如果任务尚未完成且系统终止您的应用程序,系统将自动继续在后台管理任务。如果用户终止您的应用,系统将取消所有待处理的任务。&#34;
答案 1 :(得分:0)
我的一部分感觉非常愚蠢,我的一部分真的很困惑。
事实证明,数据是正在发送。我正在使用一个不完整的上传端点,当我完成端点的实现时,图片运行良好!
但是对于整个交易 - 上传价值10MB的图片 - 调试器中显示的唯一网络流量是针对较小请求的几KB,我之前 开始任务:
我想我只是将这个提交给#X; Xcode所做的奇怪的事情&#34;并继续前进。