iOS:当应用程序在后台时执行上传任务

当iOS应用程序处于后台时,真的没有办法运行UPLOAD任务吗? 这是荒唐的。 一直在寻找像NSURLSessionUploadTaskdispatch_after ,甚至NSTimer等各种东西,但没有任何工作超过微薄的应用程序居住在背后的10秒。

其他具有上传function的应用程序是如何工作的? 说,上传到Facebook的图像,并将应用程序在后台,将取消上传?

为什么iOS不能拥有后台服务或者Android和Windows Phone等代理?

这是我的应用程序的一个重要function,在其他平台上完美的作品。

任何帮助意识到:(

如果您在实例化NSURLSession时使用[NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:]作为configuration,则可以使用iOS 7+在后台继续上传。

注意:

  • 你必须使用基于委托的NSURLSession ;

  • 你不能在后台会话中使用任务工厂方法的completionHandler再现; 和

  • 你也必须使用uploadTaskWithRequest:fromFile:方法,而不是NSData再现。

  • 您的应用程序委托必须实现application:handleEventsForBackgroundURLSession:completionHandler:并捕获完成处理程序,然后您可以调用您的NSURLSessionDelegate方法URLSessionDidFinishEventsForBackgroundURLSession:


顺便说一句,如果您不想使用后台NSURLSession ,但是您希望在应用程序离开后台后继续运行有限长度的任务超过几秒,则可以使用UIApplication方法beginBackgroundTaskWithExpirationHandler请求更多时间。 这会给你几分钟的时间来完成你正在做的任何工作。 请参阅“ iOS应用程序编程指南”的“应用程序状态 和多任务”部分的“ 背景”部分中的“ 执行有限长度任务”中的清单3-3

 UIApplication *application = [UIApplication defaultApplication]; bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ // Clean up any unfinished task business by marking where you // stopped or ending the task outright. [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; // Start the long-running task and return immediately. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Do the work associated with the task, preferably in chunks. [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; });