2016-11-26 5 views
0

Ich versuche, Alamofire (neueste Version) mit Swift 3.0, iOS 10 und xCode 8 zu verwenden. Derzeit versuchen, einen Postanruf zu machen. Der Code ist unten geschrieben und ich bekomme das gleiche Problem. Bitte helfen Sie, ich würde mich über alles freuen.Swift 3.0 Alamofire 4.0 - Domäne = NSURLErrorDomain Code = -999 "abgebrochen"

private class func getDefaultHeaders() -> HTTPHeaders { 
     let headers: HTTPHeaders = [ 
      "Connection" : "keep-alive", 
      "token" : "0781d3957fd8da6ee35c4e3124d974a2999925274771234", 
      "nonce" : "9b2436331ed908bb2f399568d2adbc4e", 
      "uuid" : "uuid", 
      "latitude" : "43.656781", 
      "longitude" : "-79.380823", 
      "Content-Type" : "application/json", 
      "userTypeId" : "1", 
      "userAgent" : "UserAgent", 
      "Content-Length" : "0", 
      "Host" : "localhost:8080", 
      "User-Agent" : "iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0" 
     ] 
     return headers 
    } 

func generateCustomSession() -> SessionManager { 
    let headers = ServicesController.getDefaultHeaders() 
    let configuration = URLSessionConfiguration.default 
    configuration.httpAdditionalHeaders = headers 
    let manager: SessionManager = SessionManager(configuration: configuration) 

    return manager 
} 

func post(url: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void) { 
     generateCustomSession().request(
      url, 
      method: .post, 
      encoding: JSONEncoding.default) 
      .validate(statusCode: 200..<300) 
      .downloadProgress { (progress) -> Void in 
       print("download progress: \(progress.fractionCompleted)") 
      } 
      .responseJSON { (response) -> Void in 
       if #available(iOS 10.0, *) { 
        print(response.metrics) 
       } 

       debugPrint(response) 

       if response.result.isSuccess { 
        let resJson = JSON(response.result.value!) 
        success(resJson) 
       } 
       if response.result.isFailure { 
        let error : Error = response.result.error! 
        failure(error) 
       } 
     } 
    } 

Antwort

0

„abgebrochen“ passieren kann, wenn es ein Problem mit einem verdächtigen https-Zertifikat ist, die vom Benutzer festgelegt werden könnte, den Zugang ermöglicht, und dass dies nicht geschieht.

Ziemlich möglich die Ursache ist der Server mit einem weniger als perfektes Zertifikat.

+0

Sollte es nicht einen Weg geben um dies zu umgehen, abgesehen davon, dass der Server das Problem mit dem Zertifikat behoben hat. – ahmad

0

Ich habe einen Weg gefunden, das Problem zu lösen. Im Folgenden finden Sie einen Code, mit dem Sie die Authentifizierungsanfrage abbrechen können. Ich empfehle das nicht, dies ist nützlich für temporäre Lösung. Am besten validieren Sie die Authentifizierung noch vollständig.

let manager: SessionManager = SessionManager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)) 
    manager.delegate.sessionDidReceiveChallenge = { session, challenge in 
      var disposition: URLSession.AuthChallengeDisposition = .cancelAuthenticationChallenge 
      var credential: URLCredential? 

      if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
       disposition = URLSession.AuthChallengeDisposition.useCredential 
       credential = URLCredential(trust: challenge.protectionSpace.serverTrust!) 
      } else { 
       if challenge.previousFailureCount > 0 { 
        disposition = .cancelAuthenticationChallenge 
       } else { 
        credential = manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace) 
        if credential != nil { 
         disposition = .useCredential 
        } 
       } 
      } 

      return (disposition, credential) 
    } 


    return manager 
} 
Verwandte Themen