网络请求在Swift中不定期超时(使用Alamofire)

时间:2019-03-22 21:34:07

标签: ios swift networking alamofire promisekit

我们遇到的超时问题很少,偶尔也有。重现非常困难,因为它无处不在,并且重试(通过执行完全相同的操作来重发请求,例如按下按钮),我们很可能会成功地获得响应。这是在不同的设备上发生的。

以下是我们的平台信息: XCode 10.1 斯威夫特4.2 Alamofire 4.8.1 PromiseKit 6.8.3

这是我们的请求示例之一:

public class NetworkingHelpers {
  // MARK: Singleton
  public static let shared = NetworkingHelpers()
  private let alamofireManager: SessionManager

  // MARK: Init
  private init() {    
    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = 30
    configuration.timeoutIntervalForResource = 30
    alamofireManager = Alamofire.SessionManager(configuration: configuration)
  }

  public func makePublicRequest<T: Decodable>(url: String, decodeAsType: T.Type, method: HTTPMethod = .get,
                                              params: [String: Any]? = nil) -> Promise<T> {
    return alamofireManager.request(url, method: method, parameters: params, encoding: JSONEncoding.default, headers: self.anonymousHeaders)
      .response(.promise)
      .recover(policy: .allErrorsExceptCancellation) { error -> Promise<(URLRequest, HTTPURLResponse, Data)> in
        // This is a error thrown by the alamofireManager, but not from the server
        // Most likely it is a timeout
        let e = error as NSError
        throw RequestErrorUtils.generateRequestError(e.code)
      }
      .then { (request, response, data) -> Promise<T> in
        // Process response
    }
  }

如果超时,Alamofire将向我们抛出错误-1001,这是30秒超时错误。这也意味着alamofireManager已处理了我们的请求。

这种情况非常随机发生,正如我们提到的,手动重试通常会成功。我们无法从服务器端捕获任何日志。我们对此问题有一些假设。

  • iOS容易出错,偶尔会丢失请求
  • Alamofire是越野车,它偶尔会随机丢失请求
  • 我们的网络偶尔会随机掉线
  • 我们的服务器偶尔随机响应失败

我们还将使用Netfox监听来自我们设备的请求,以便我们缩小问题范围。

有人之前有类似的问题吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

有了这样一个问题,没有什么是结论性的,但是对我来说,这一直是网络问题。我没有使用过Netfox,但是Charles确实提供了帮助。我还使用curl等获取第二意见(帮助您确定自己是否不疯狂等)。

在这一点上,由于您无法按照Agan必读的book on debugging来“刺激失败”,因此您需要更多信息。

那么您最好的选择就是您所暗示的-使用Charles之类的代理来查看网络级别上发生的事情(至少对于传出请求而言),并将日志分别添加到服务器。

>