我的应用需要从用户手机上传视频文件,然后在服务器上处理。 问题是文件的大小可以达到200 MB以上,用户不会保持应用程序打开以等待文件上传。由于苹果不允许应用程序在后台运行超过有限的时间。如何确保上传文件。我正在使用afnetworking来设置ios 7库给出的上传任务。
如果有人能指出我正确的方向或有任何解决方案,我们将不胜感激。我已经把这个问题拖了很长时间。感谢。
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
[manager setTaskDidSendBodyDataBlock:^(NSURLSession *session,NSURLSessionTask *task ,int64_t bytesSent, int64_t totalBytesSent,int64_t totalBytesExpectedToSend){
CGFloat progress = ((CGFloat)totalBytesSent / (CGFloat)sensize);
NSLog(@"Uploading files %lld -- > %lld",totalBytesSent,totalBytesExpectedToSend);
[self.delegate showingProgress:progress forIndex:ind];
}];
dataTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
}
}];
我的请求是正常的多部分表单请求。
答案 0 :(得分:6)
使用:
NSURLSessionConfiguration:backgroundSessionConfiguration:
而不是
NSURLSessionConfiguration:defaultSessionConfiguration
来自NSURLSessionConfiguration:backgroundSessionConfiguration:
documentation:
后台会话中的上传和下载任务由外部守护程序而不是应用程序本身执行。因此,即使应用程序被暂停,退出或崩溃,传输也会在后台继续进行。
所以在你的情况下,改变:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
为:
NSString *appID = [[NSBundle mainBundle] bundleIdentifier];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID];
在您的应用委托上实施application:handleEventsForBackgroundURLSession:completionHandler:
将允许您的应用在上传完成后被唤醒(即在后台模式下未暂停或未终止)(无论是否已成功完成)。
不要与背景提取混淆。你不需要它。背景提取简单地唤醒你应用程序定期给你的应用程序定期获取少量内容的机会。但是,它可能会定期重新启动失败的“后台模式”上传。
答案 1 :(得分:-1)
如果是默认会话配置,则应使用background session configuration。这可确保用户退出应用后,您的数据传输将在后台继续。
当然,只要用户在设备的“设置”应用中为您的应用启用了后台提取,这是正确的。
请务必在项目设置中启用 后台提取 功能:
Capabilities http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa02.png
Background fetch http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa03.png
然后在您的App Delegate中实施application:handleEventsForBackgroundURLSession:completionHandler:
,以便在数据传输结束时收到通知,并使用收到/发送的文件在您的应用内执行您需要做的任何操作(UI更新...)。 请勿忘记致电completionHandler
以通知系统您已完成任务。 iOS随后将截取您应用的活动屏幕截图并更新iOS 7多任务屏幕中的屏幕截图。