【问题标题】:NSURLSession with share extension returns -995 on OSX具有共享扩展名的 NSURLSession 在 OSX 上返回 -995
【发布时间】:2016-04-12 14:34:39
【问题描述】:

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

一旦我开始执行任务,委托就会被回调,并带有世界上最没有帮助的错误消息:

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?

【问题讨论】:

  • this question 怎么样?
  • 这只是告诉我设置 sharedContainerIdentifier ,我已经说过我已经完成了。
  • 向 Apple 提交错误。该错误代码应该记录在案,而不是。只有 Apple 的人才能告诉你这很可能意味着什么,除非有人碰巧偶然发现了它。

标签: macos networking nsurlsession


【解决方案1】:

(请耐心等待,我还没有代表发表评论,所以我必须回答,尽管您可能发现了错误,但我添加的最后一部分可能会帮助其他人)

当您使用 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”,然后才能在应用和扩展程序中检查它们,但我可能错了。

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

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

我可能又弄错了,但这似乎是在应用扩展中使用第三方库时的普遍问题 - 例如。我刚刚在尝试使用 ChromeCast SDK 时遇到了这个错误,这可能是问题所在。

【讨论】:

  • 这里的 Config.appGroupName 是什么?
  • 一般来说,这是一个组标识符,用于以编程方式链接不同的代码库。例如。如果您有一个扩展程序向数据库中添加一行,然后您在应用程序中读取,则它们都必须具有相同的 appGroupName,并且启用了应用程序组。
  • 特别是在扩展/下载的情况下,下载被委派给这个 appGroup 标识符,并用你的应用程序而不是你的扩展程序来计算。这是必要的,因为您的扩展程序和应用程序具有不同的生命周期,并且扩展程序更简单且更有可能被杀死。
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多