swift URLSession仅在Hive网络上神秘失败

dwbf0jvd  于 2023-04-28  发布在  Swift
关注(0)|答案(1)|浏览(143)

这样打的电话

let jsonData = try JSONSerialization.data(withJSONObject: requestBody)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData

let (data, response) = try await URLSession.shared.data(for: request)

当我从模拟器调用它时,它的工作完美100%的时间。
当我在手机上运行它,而在WiFi上,它的工作完美的100%的时间。
但是当我在手机网络上运行它的时候。它失败了随机
但如果我尝试使用手机上的另一个API测试应用程序调用该端点。它的工作。
当它失败时,我得到的错误如下:
Error Domain=NSURLErrorDomain Code=-1005“网络连接丢失。“UserInfo={_kCFStreamErrorCodeKey=57,NSUnderlyingError=0x28198df50 {Error Domain=kCFErrorDomainCFNetwork Code=-1005“(null)”UserInfo={NSErorPeerAddressKey =〈CFData 0x2833f6e20 [0x1e1c79d10]〉{length = 28,capacity = 28,bytes = 0x1c1e01bbb0000000260647000020000000。.. 681 a00 aa 00000000},_kCFStreamErrorCodeKey=57,_kCFStreamErrorDomainKey=1}},_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<2>,_NSURLErrorRelatedURLSessionTaskErrorKey=(“LocalDataTask .<2>“),NSLocalizedDescription=网络连接丢失。,NSErrorFailingURLStringKey=https://blahblah/v1/run,NSErrorFailingURLKey=https://blahblah/v1/run,_kCFStreamErrorDomainKey=1}

vaqhlq81

vaqhlq811#

你的POST身体有多大?Hive网络有时可能非常脆弱,上传大文件时丢失连接并不罕见。
如果你要上传大块的数据,一个好的策略是改变服务器端,允许你分块上传数据,重试每个块直到成功,然后在上传完所有内容后在服务器端合并这些块。
否则,您应该问的下一个问题是是否可以使请求幂等。如果可以以这样的方式发出请求,发送两次不会造成任何伤害,那么您应该使用GET请求,以便NSURLSession机器可以在某些类型的网络故障,网络更改等之后重试请求。POST请求 * 从不 * 重试。
第三个问题是您是否使用回调覆盖了会话的任何行为。如果是这样,您确定每次都调用提供的回调吗?我看到的一些常见错误包括:

  • 未能为您不关心的类型的证书/密码/身份验证请求调用默认处理。
  • 进行NSURLConnection风格的调用,继续请求而不是调用回调(这有时会起作用,但并不总是起作用)。
  • 存储回调以在执行其他操作后调用,然后有时无法调用它。
  • 从一个与调用它的调度队列不同的调度队列中调用回调(这可能没问题,但IIRC经常会导致问题)。
  • 将会话配置为使用并发NSOperation队列。😁
  • 阻塞/死锁会话用于分派回调的队列。

等等。任何一种情况都会导致非常奇怪的行为。
除此之外,还要查看您在设置会话和连接的方式上是否存在任何差异,包括会话配置的差异、共享缓存配置的差异、任务创建的差异、线程模型的差异等。
祝你好运

相关问题