具有共享扩展名的NSURLSession在OSX上返回-995

时间:2016-04-12 14:34:39

标签: macos networking nsurlsession

我正在尝试使用带有OSX共享扩展的后台任务的NSURLSession上传数据。

一旦我开始执行任务,代理人就会回复世界上最不实用的错误消息:

The operation couldn’t be completed. (NSURLErrorDomain error -995.)

NSError对象中没有其他信息,也没有在控制台中。

在搜索互联网之后,我唯一的线索是确保我已正确设置configuration.sharedContainerIdentifier,但我已经这样做了:

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(uniqueId)
configuration.sharedContainerIdentifier = Config.appGroupName
urlSession = NSURLSession.init(configuration: configuration, delegate: self, delegateQueue: nil)

然后我准备请求并创建任务:

let task = self.urlSession!.dataTaskWithRequest(request)
self.tasks.append(task)
task.resume()

请注意,从我的主应用程序开始,一切都很完美。这只是共享扩展失败了。

还有哪些其他问题可能导致错误-995?

1 个答案:

答案 0 :(得分:1)

(跟我一起,我还没有回复评论所以我必须回答,尽管你发现了一个错误的可能性,但我添加的最后一部分可能会帮助其他人)< / em>的

当您使用NSURLSession时,任何完成的后台上传/下载都将启动您的主应用程序。这在Common Scenarios页面中详细说明。

如您所示,您需要将NSURLSessionConfiguration设为sharedContainerIdentifier

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(uniqueId)
configuration.sharedContainerIdentifier = Config.appGroupName
urlSession = NSURLSession.init(configuration: configuration, delegate: self, delegateQueue: nil)

您还需要确保您的应用扩展程序和主应用程序都在Xcode的“应用程序组”选项中进行了三重检查(我正在查看Xcode 8.1),这意味着:

  • 应用和扩展程序的应用程序组名称相同(
  • Add the App Group entitlements in the entitlement file
  • 旁边的检查
  • Add the App Groups feature to your App ID
  • 旁边的检查
  • Add App Groups to your App ID
  • 旁边的检查

检查需要在 应用和扩展程序上进行。

我在添加这些内容时有点生疏,但我的回忆是这些没有以正确的顺序列出,例如您必须先将“应用程序组添加到您的ID”,然后才能在应用程序和扩展程序中检查它们,但我可能错了。

高级 - 应用扩展程序中的第三方库。

查看第三方Twitter REST库github项目nst/STTwitter,他们needed to add一个可配置的组ID,允许将NSURLSessionConfiguration sharedContainerIdentifier设置为库< em>用户的组ID。

我可能会再次弄错,但在应用扩展程序中使用第三方库时,这似乎是一个普遍的问题 - 例如我刚刚尝试使用ChromeCast SDK时遇到此错误,这可能是裤子里的一脚。