我试图通过动作扩展程序从Photo应用程序上传图像。我使用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,因此问题仍然存在。
任何建议都会有所帮助。提前谢谢。
答案 0 :(得分:1)
确保在第一个会话仍在运行时尝试使用相同的标识符实例化第二个后台会话。保存后台会话,以便以后使用。
作为"后台会话注意事项"的URL Loading System Programming Guide: Using NSURLSession说:
注意:您必须为每个标识符创建一个会话(在创建配置对象时指定)。共享相同标识符的多个会话的行为未定义。
请注意,本文档还提到了一个"必须"指定并实现委托。 (如果没有其他内容,如果您不这样做,您将如何知道失败?)App Extension Programming Guide的执行上传和下载部分中提供的示例指定了委托,太
此外,您的主应用应用代理是否已实施handleEventsForBackgroundURLSession
方法?您必须捕获completionHandler
并在调用NSURLSessionDelegate
方法URLSessionDidFinishEventsForBackgroundURLSession
时调用它。
最后,我注意到您正在使用数据任务。 NSURLSession
文档是特定的,不应该使用具有后台会话的数据任务,只能上载/下载任务。我一直认为这样你就不会尝试使用didReceiveData
委托方法,但我可能会尝试使用上传任务,以防万一其他问题与后台会话的数据任务相关联。