【问题标题】:Swift 5.5: Async/Await URLSession.shared.data() throws an errorSwift 5.5:Async/Await URLSession.shared.data() 抛出错误
【发布时间】:2021-09-19 05:51:39
【问题描述】:

我尝试使用 Swift 5.5 中新的 Async/Await 功能并尝试了以下代码

let url = URL(string: "http://itunes.apple.com/lookup?bundleId=\(id)&country=at")

let (data, _) = try await URLSession.shared.data(from: url!)

let resultStruct = try jsonDecoder.decode(ResponseStruct.self, from: data)

每次执行此操作时,try await URLSession.shared.data(from: url!) 部分都会引发错误。如果我抓住它并打印error.localizedString,我总是会被“取消”。这发生在所有不同类型的 URL 上。我试图坚持我在网上找到的教程,但我在这里缺少什么?

编辑:我强制应用程序进入运行时异常以获取有关错误的更多详细信息:

Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSURLErrorDomain Code=-999 "cancelled"

正如这篇文章所解释的NSURLErrorDomain error code -999 in iOS,当服务器的 SSL 证书有问题时会发生此错误,我不认为是这种情况,因为我正在访问 iTunes 服务器或请求被其他任何东西取消时在我的应用中,对我来说似乎就是这种情况。

【问题讨论】:

  • 你不是在操场上测试吗?
  • 不,我在一个 iOS 应用项目中编码。
  • 无法复制。我完全尝试了您的代码,前两行成功了。你有事瞒着我们。根据提供的信息,投票结束是不可复制的。
  • 另外,从您的其他评论来看,您可能正试图以某种方式将其与 Combine 框架结合起来。那是错误的。 Cancelled 正是我期望看到的从未给出.store 命令的组合管道。
  • combine 是我先写的替代方案。我有两个功能相同。他们访问 url,然后在结果结构中有一些我保存到字典中的数据,但在这个函数中,这个点永远不会到达。使用 combine 框架的函数按预期工作。我也没有其他东西可以展示。上面的代码包含在一个标有 async 和 throws 的函数中。

标签: ios swift async-await urlsession swift5.5


【解决方案1】:

http 更改为https。除非您向 Info.plist 添加例外以禁用应用程序传输安全性,否则您通常无法调用不安全的调用。

您的控制台中还应该有来自 App Transport Security 的日志。

由于 ATS 阻止连接,请求被取消。

更多信息请见NSAppTransportSecurity

【讨论】:

  • 不幸的是,事实并非如此。有趣的是,如果我将 .dataTaskPublisher() 与接收器一起使用,它可以在没有 https 的情况下工作,并且我没有在 Info.plist 中添加任何例外
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 2021-10-15
  • 2021-10-02
  • 2020-10-17
  • 2021-12-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
相关资源
最近更新 更多