3

我正在尝试通过操作扩展从照片应用程序上传图像。我使用 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,因此问题仍然存在。

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

4

1 回答 1

2

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

正如 URL 加载系统编程指南的“后台会话注意事项” :使用 NSURLSession所说:

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

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

另外,您的主应用程序的应用程序委托是否实现了该handleEventsForBackgroundURLSession方法?您必须捕获completionHandler并在调用该NSURLSessionDelegate方法时调用它URLSessionDidFinishEventsForBackgroundURLSession

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

于 2014-12-05T13:15:57.003 回答