Action Extension - 多个NSURLSession

问题描述:

我试图通过Action Extension从Photo应用上传图片。我使用NSURLSession在后台上传它。这是我使用的代码。Action Extension - 多个NSURLSession

var configName = "com.myapp.uploadImage" 
var config = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(configName) 
config.sharedContainerIdentifier = "group.myApp.sample" 

var session = NSURLSession(configuration: config) 
let task = session.dataTaskWithRequest(request) 
task.resume() 

self.extensionContext!.completeRequestReturningItems(self.extensionContext!.inputItems, completionHandler: nil) 

它工作正常。

问题是,当我上传图像并关闭视图一次,然后尝试上载第二个图像,而初始过程仍在后台运行时,初始NSURLSession未完成。只有第二个过程完成。总之,第二次会议胜过了第一次会议。

我试过使用NSOperationQueue。但行动延伸一度被驳回并在第二届会议上再次开放,它只是创建了一个新的NSOperationQueue,因此问题仍然存在。

任何建议都会有帮助。提前致谢。

确保在第一个仍在运行时不尝试使用相同标识符实例化第二个后台会话。保存你的后台会话,以便以后使用它。

由于URL Loading System Programming Guide: Using NSURLSession的“背景会议注意事项”说:

注意:您必须创建每个标识符(当您创建的配置对象指定)只有一个会话。共享相同标识符的多个会话的行为未定义。

请注意,该文件还提到一个“必须”指定和实施委托。 (如果没有别的,如果不这样做,您将如何知道故障?)App Extension Programming Guide执行上传和下载部分中提供的示例也指定了委托。

此外,您的主应用的应用委托实施了handleEventsForBackgroundURLSession方法吗?您必须捕获completionHandler并在调用NSURLSessionDelegate方法URLSessionDidFinishEventsForBackgroundURLSession时调用它。

最后,我注意到您正在使用数据任务。 NSURLSession文档明确指出,不应将数据任务与后台会话一起使用,只能上载/下载任务。我总是认为这只是因为你不会尝试使用didReceiveData委托方法,但我可能会尝试使用上传任务,以防其他与后台会话数据任务相关的问题。

+0

我试过使用不同的标识符。仍然是同样的问题。 – 2014-12-05 13:47:30

+0

另外,委托方法不会有帮助。正如Apple的指导方针所说的,我们必须解除动作扩展并在后台运行nsurlsession。所以随着行动延伸解散,代表也被杀死。 – 2014-12-05 13:49:03

+0

我已经在应用程序中执行了很久的nsurlsessions。它每次都很好。但行动延伸有一个指导方针,这听起来很合理。 – 2014-12-05 13:51:21