【问题标题】:SURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) Swift 3SURLSession/NSURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9813) Swift 3
【发布时间】:2017-08-24 15:09:00
【问题描述】:

我的代码如下:

var components = URLComponents()
components.queryItems = args.map {
    URLQueryItem(name: $0, value: $1)
}
let paramToSend = components.query!

let url = URL(string: "https://my-test-server.com")
let session = URLSession.shared

let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
request.httpBody = paramToSend.data(using: String.Encoding.utf8)

let task = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in

    guard let _:Data = data else{ return }

    let json:Any?

    do{
        json = try JSONSerialization.jsonObject(with: data!, options: [])
    } catch{
        return
    }

    guard let server_response = json as? NSDictionary else { return }
    print(server_response)

    guard let data_block = server_response["data"] as? NSDictionary else { return }

    guard let session_data = data_block["session"] as? String else { return }

    let preferences = UserDefaults.standard
    preferences.set(session_data, forKey: "session")

    //                        DispatchQueue.main.async (
    //                          //  execute:self.LoginDone
    //                        )

})

task.resume()

测试服务器有ssl证书,我已经通过拖动到模拟器进行了验证。但仍然是同样的错误。 我在firefox中测试了这个调用,它工作正常。 我还更新了Allow Arbitrary Loads: YES 的 info.plist 请指导我出了什么问题。

谢谢

【问题讨论】:

  • 一些一般性建议:使用安全的可选解包,并且不要使用具有原生 Swift 等效项的 Foundation 数据类型(例如 NSDictionary

标签: swift3


【解决方案1】:

试试这个

print("urlPath:==> \(urlPath) ")
let session = Foundation.URLSession.shared
let url = URL(string: urlPath)
var request = URLRequest(url : url!)
request.httpMethod = "POST"

do {

    let jsonData = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)

    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.httpBody = jsonData

    session.dataTask(with: request, completionHandler: { data, response, error in
        OperationQueue.main.addOperation {

            guard error == nil && data != nil else {                                                          // check for fundamental networking error
              return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")

            }

            let responseString = String(data: data!, encoding: String.Encoding.utf8)
            print("responseString = \(responseString!)")

            if let responsedata = responseString!.data(using: String.Encoding.utf8)! as? Data{

                do {

                    let jsonResult:NSDictionary = try JSONSerialization.jsonObject(with: responsedata, options: []) as! NSDictionary
                    print("Get The Result \(jsonResult)")
                     //check your error response is null or not
                    if error != nil {
                        print("error=\(error)")
                    }

                     //check your success response is null or not
                    if let str = jsonResult["success"] as? NSNull {
                        print("error=\(str)")

                    }
                    else {
                        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
                        print("Response string : \(responseString)")

                    }



                } catch let error as NSError {
                    print(error.localizedDescription)
                }
            }
        }
        }) .resume()
}catch {
    //                print("Error -> \(error)")

}

【讨论】:

    【解决方案2】:

    我设法解决了这个问题。只是想分享经验以帮助面临同样问题的人。

    执行以下步骤:

    1) 将自签名证书文件 (.crt) 添加到钥匙串访问。

    2) 在钥匙串访问中将证书标记为“始终受信任”

    3) 将证书导出为 .cer

    4) 将.cer文件拖到iphone模拟器并安装证书

    5) 在 iphone 模拟器中转到常规 > 关于 > 证书信任设置并为根证书启用完全信任

    测试应用程序,它现在可以在不更改任何受信任和不受信任证书的代码的情况下运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2016-11-02
      • 1970-01-01
      • 2015-09-04
      • 2015-01-06
      相关资源
      最近更新 更多