1

为什么下面的代码会导致两者都URLSession返回and ?nildataerror

let task = URLSession.shared.dataTask(with: storeRequest as URLRequest) { data, _, error -> Void in

    // there is an error
    if let networkError = error {
        print("There was a network error")
        return
    }

    // there is no data
    guard let safeData = data else {
        print("No network error, but no data either")
        return
    }
...

在运行此代码时,一位用户点击了这No network error, but no data either条线。

根据Apple的文档URLSession.dataTask

如果请求成功完成,completion handler 块的 data 参数包含资源数据,error 参数为 nil。如果请求失败,则 data 参数为 nil,error 参数包含有关失败的信息。

我将其读为:要么dataerror应该始终为非零。但这似乎并没有在这里发生。在什么情况下两者都为零?

(如果有帮助 - 有问题的 URL 是https://buy.itunes.apple.com/verifyReceipt上的 iTunes 收据验证 API,受影响的用户是 Apple 的审阅者,他们通常不愿意协助调试。这段代码实际上是 SwiftyStoreKit 的一部分,它会导致SwiftyStoreKit.ReceiptError error 1审阅者的错误——但绝不会导致其他任何人。)

4

1 回答 1

5

这可能取决于您在(文档HTTPURLResponse完成处理程序中忽略的 )表明响应虽然是 type ,但实际上是 type - 因此它将具有有助于理解您的请求结果的属性..dataTaskURLSession.dataTaskURLResponseHTTPURLResponsestatusCode

请求很可能已经成功,但没有返回数据(即204 No Content响应或300 Redirect响应)。这些不会有数据响应,但也不会有错误响应,因为请求没有失败。

于 2019-08-02T19:14:13.410 回答