0

我尝试使用 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"

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

4

2 回答 2

2

我在 SwiftUI 应用程序中遇到了同样的问题。我使用task视图修饰符异步加载数据并根据加载状态更新视图。

文档中所述:

如果在 SwiftUI 删除视图或视图更改身份之前任务未完成,则 SwiftUI 将取消任务。

如果是这种情况,请确保仅在任务完成后更新 UI。

替代解决方案

或者,您可以使用onAppear视图修饰符(不会取消任务)并在其主体内运行任务:

Color.clear.onAppear {
    Task {
        await viewModel.load()
    }
}
于 2022-01-21T16:01:23.317 回答
2

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

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

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

有关更多信息,请参阅NSAppTransportSecurity

于 2021-07-08T18:44:38.380 回答