我正在尝试使用带有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?
答案 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时遇到此错误,这可能是裤子里的一脚。