当iOS应用程序在后台时,是否真的无法运行UPLOAD任务?这是荒唐的。一直在查看NSURLSessionUploadTask
,dispatch_after
甚至NSTimer
等各种内容,但没有任何内容比应用程序在后台运行后的10秒钟更有效。
其他具有上传功能的应用如何运作?比如说,将图像上传到Facebook并将应用程序置于后台会取消上传吗?
为什么iOS不能拥有像Android和Windows Phone这样的后台服务或代理?
这是我的应用程序的一个重要功能,在其他平台上运行完美。
感谢任何帮助:(
答案 0 :(得分:16)
如果在实例化URLSession
时使用background(withIdentifier:)
进行配置,则可以在后台使用iOS 7+继续上传。
注意:
您必须使用基于代理的URLSession
;
您不能将任务工厂方法的完成处理程序再现与后台会话一起使用;和
您还必须使用uploadTask(with:fromFile:)
方法,而不是Data
格式。
您的应用委托必须实施application(_:handleEventsForBackgroundURLSession:completionHandler:)
并捕获该完成处理程序,然后您可以使用URLSessionDelegate
方法urlSessionDidFinishEvents(forBackgroundURLSession:)
调用该文件。
顺便说一下,如果你不想使用后台NSURLSession
,但是你想在应用程序离开后台后继续运行一个有限长度的任务超过几秒钟,你可以请求使用UIApplication
方法beginBackgroundTaskWithExpirationHandler
的更多时间。这将为您提供几分钟的时间来完成您正在处理的任何任务。请参阅Extending Your App's Background Execution Time中的清单1:
func sendDataToServer( data : NSData ) {
// Perform the task on a background queue.
DispatchQueue.global().async {
// Request the task assertion and save the ID.
self.backgroundTaskID = UIApplication.shared.
beginBackgroundTask (withName: "Finish Network Tasks") {
// End the task if time expires.
UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
self.backgroundTaskID = UIBackgroundTaskInvalid
}
// Send the data synchronously.
self.sendAppDataToServer( data: data)
// End the task assertion.
UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
self.backgroundTaskID = UIBackgroundTaskInvalid
}
}