Alamofire在HTTPS上运行缓慢,但在HTTP上运行良好

时间:2019-11-18 08:03:08

标签: ios swift api server alamofire

在我的应用中有多个Apis。我有两个differnet服务器,一个用于HTTP,一个用于HTTPS 当我在Http上运行我的应用程序时:对于每个Api,第一次运行正常,对于每个Api相同的响应时间,则运行2秒。 但是当我在https上运行App时:第一次为每个APi花费额外的时间为每个Api进行操作,那么如果我再次击中相同的Api,则速度很快。问题是为什么每个APi第一次运行缓慢还是要花费额外的时间。但是Android App不会发生任何事情。

这是“我的请求”构建器类:URLRequestBuilder.swift

import Foundation
import Alamofire

protocol URLRequestBuilder: URLRequestConvertible, APIRequestHandler {

    var mainURL: URL { get }
    var requestURL: URL { get }
    var path: String { get  }
    var parameters: Parameters? { get }
    var method: HTTPMethod { get }
    var encoding: ParameterEncoding { get }
    var urlRequest: URLRequest { get }
}

extension URLRequestBuilder {

    var encoding: ParameterEncoding {
        switch method {
        case .get:
            return URLEncoding.default

        default:
            return JSONEncoding.default
        }
    }

    var mainURL: URL  {
        return URL(string: SERVER_URL)!
    }

    var requestURL: URL {
        var fullURL  = mainURL.absoluteString + path

        if L102Language.currentAppleLanguage() == "ar" && path.contains("?") {
            fullURL = fullURL + "&blLocaleCode=ar"
        } else  if L102Language.currentAppleLanguage() == "ar" {
            fullURL = fullURL + "?blLocaleCode=ar"
        }
        let urlComponents = URLComponents(string: fullURL)!
        return urlComponents.url!
    }

    var urlRequest: URLRequest {
        var request = URLRequest(url: requestURL)
        request.httpMethod = method.rawValue

        if UserDefaults.standard.isUserLoggedIn()  {
            request.setValue(UserDefaults.standard.getAccessToken(), forHTTPHeaderField:  NETWORK_ACCESS_TOKEN)
        }
        request.setValue(NETWORK_REQUEST_TYPE, forHTTPHeaderField:  NETWORK_ACCEPT)
        request.setValue(NETWORK_REQUEST_TYPE, forHTTPHeaderField:  NETWORK_CONTENT_TYPE)
        //request.cachePolicy = .useProtocolCachePolicy
        return request
    }

    func asURLRequest() throws -> URLRequest {
        return try encoding.encode(urlRequest, with: parameters)
    }
}


final class NetworkClient {

    let evaluators = [
        "somehttpsURL.com": ServerTrustPolicy.pinCertificates(
            certificates:  [Certificates.stackExchange],
            validateCertificateChain: true,
            validateHost: true)
    ]
    let session: SessionManager

    // 2
    private init() {

        session = SessionManager(
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: evaluators))
    }

    // MARK: - Static Definitions

    private static let shared = NetworkClient()

    static func request(_ convertible: URLRequestConvertible) -> DataRequest {
        return shared.session.request(convertible)
    }
}

struct Certificates {
    static let stackExchange =
    Certificates.certificate(filename: "certificate") 

    private static func certificate(filename: String) -> SecCertificate {
        let filePath = Bundle.main.path(forResource: filename, ofType: "der")!
        let data = try? Data(contentsOf: URL(fileURLWithPath: filePath))
        let certificate = SecCertificateCreateWithData(nil, data! as CFData)!
        return certificate
    }
}

我的请求处理程序类是:

extension APIRequestHandler where Self : URLRequestBuilder {
   // For Response Object
   func send<T: AnyObject>(modelType: T.Type,  data: [UIImage]? = nil, success: @escaping ( _ servicResponse: AnyObject) -> Void, fail: @escaping ( _ error: NSError) -> Void, showHUD: Bool)  where T: Mappable {
        if let data = data {
            uploadToServerWith(modelType: modelType, images: data, request: self, parameters: self.parameters, success: success, fail: fail)
        } else {
            //print(requestURL.absoluteString)
            // NetworkClient.
          request(self).authenticate(user: APIAuthencationUserName, password: APIAuthencationPassword).validate().responseObject { (response: DataResponse<T>) in
               switch response.result {
               case .success(let objectData):
                  success(objectData)
                  break
               case .failure(let error):
                  print(error.localizedDescription)
                  if error.localizedDescription == RefreshTokenFailed {
                      self.getAccessTokenAPI(completion: { (value) in
                          if value == TOKEN_SAVED {
                               self.send(modelType: modelType, success: success, fail: fail, showHUD: showHUD)
                              return
                          }else {
                              fail(error as NSError)
                          }
                      })
                  } else {
                      fail(error as NSError)
                  }
              }
          }
      }
  }
}

0 个答案:

没有答案