使用NSURLSession连接到具有无效证书的服务器(swift2,xcode7,ios9)

前端之家收集整理的这篇文章主要介绍了使用NSURLSession连接到具有无效证书的服务器(swift2,xcode7,ios9)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 Xcode 7,Swift 2和iOS9.我想使用NSURLSession连接到Web服务,但是当我尝试连接时出现以下错误

2015-10-13 16:07:33.595 XCTRunner[89220:4520715] NSURLSession/NSURLConnection HTTP load Failed (kcfStreamErrorDomainSSL,-9813)
2015-10-13 16:07:33.604 XCTRunner[89220:4520571] Error with connection,details: Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “domainapi.com” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7fac7b6facc0>,NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?,

这是我的代码

func request( dataPost : String,successHandler: (response: String) -> Void)-> String {
        let destination:String =  "https://domainapi.com:8743/WebService/sendData"
        let request = NSMutableURLRequest(URL: NSURL(string: destination as String)!)
        request.HTTPMethod = "POST"
        let postString = dataPost
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        request.setValue("0",forHTTPHeaderField: "Content-Length")
        request.setValue("application/xml",forHTTPHeaderField: "Content-Type")
        request.setValue("gzip,deflate",forHTTPHeaderField: "Accept-Encoding")
        request.setValue("Keep-Alive",forHTTPHeaderField: "Connection")
        NSLog("Body is: %@",request.HTTPBody!)
        NSLog("Request is: %@",request.allHTTPHeaderFields!)
        NSLog("URL is: %@",destination)

        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data,response,error in


            if error != nil {
                NSLog("Error with connection,details: %@",error!)
                return
            }

            let responseString = NSString(data: data!,encoding: NSUTF8StringEncoding)

            successHandler(response: responseString as String!);
            NSLog("Data received: %@",data!)

        }

        task.resume()
        return "worked"
    }
    func viewDidLoad() {
        let dataPost : String = "<webservices>xml data sending</webservices>"
        request(dataPost,successHandler: {
            (response) in
            let text = response
            print(text)
        });

我已经研究过NSURLAuthenticationChallenge,但我似乎无法用我现有的代码解决这个问题.所以我的问题是如何才能连接到服务器?我已经尝试将域添加到Info.plist中的NSAppTransportSecurity但是没有用.打开NSAllowsArbitraryLoads也不起作用.任何帮助,将不胜感激.

解决方法

请看一下这篇文章.7000,特别是有关自签名证书的部分.

你很可能需要表单的委托方法,

func URLSession(session: NSURLSession,didReceiveChallenge challenge: NSURLAuthenticationChallenge,completionHandler: (NSURLSessionAuthChallengeDisposition,NSURLCredential?) -> Void) {
    completionHandler(
        .UseCredential,NSURLCredential(trust: challenge.protectionSpace.serverTrust!)
    )
}

将此添加到我自己的使用NSURLSession的comms类修复了该问题.

猜你在找的Xcode相关文章