Время ожидания сетевых запросов в Swift нерегулярно (с использованием Alamofire) - PullRequest
0 голосов
/ 23 марта 2019

Очень редко и время от времени у нас возникали проблемы с тайм-аутом по некоторым нашим запросам. Воспроизвести его сложно, так как это происходит просто из ниоткуда и при повторной попытке (повторная отправка запроса с помощью точно такого же действия, как нажатие кнопки), мы, скорее всего, успешно вернем ответ. Это произошло на разных устройствах.

Здесь информация о нашей платформе: XCode 10.1 Swift 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 голосов
/ 23 марта 2019

С таким вопросом ничто не может быть окончательным, но для меня это всегда были проблемы с сетью. Я не использовал Netfox, но Чарльз очень помог с этим. Я также использовал скручивание и т. Д. Для получения второго мнения (помогает вам определить, не сумасшедший ли вы и т. Д.).

На данный момент, поскольку вы не можете "стимулировать неудачу" согласно обязательной для чтения Агане книге по отладке , вам нужна дополнительная информация.

Ваши лучшие варианты - это то, на что вы ссылались - используя прокси, такой как Charles , чтобы увидеть, что происходит на сетевом уровне (по крайней мере, для исходящих запросов), и отдельно добавить протоколирование на сервер.

...