我们遇到的超时问题很少,偶尔也有。重现非常困难,因为它无处不在,并且重试(通过执行完全相同的操作来重发请求,例如按下按钮),我们很可能会成功地获得响应。这是在不同的设备上发生的。
以下是我们的平台信息: 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
已处理了我们的请求。
这种情况非常随机发生,正如我们提到的,手动重试通常会成功。我们无法从服务器端捕获任何日志。我们对此问题有一些假设。
我们还将使用Netfox
监听来自我们设备的请求,以便我们缩小问题范围。
有人之前有类似的问题吗? 谢谢!
答案 0 :(得分:0)
有了这样一个问题,没有什么是结论性的,但是对我来说,这一直是网络问题。我没有使用过Netfox,但是Charles确实提供了帮助。我还使用curl等获取第二意见(帮助您确定自己是否不疯狂等)。
在这一点上,由于您无法按照Agan必读的book on debugging来“刺激失败”,因此您需要更多信息。
那么您最好的选择就是您所暗示的-使用Charles之类的代理来查看网络级别上发生的事情(至少对于传出请求而言),并将日志分别添加到服务器。
>