我正在使用 swift 3 并第一次访问网络服务。我的 Web 服务通过 HTTPS 运行,我想使用适当的加密进行测试。
到目前为止,这是我的代码:
let config = URLSessionConfiguration.default // Session Configuration
let session = URLSession(configuration: config) // Load configuration into Session
let url = URL(string: webService.getLoginUrl())!
let task = session.dataTask(with: url, completionHandler: {
(data, response, error) in
if error == nil {
do {
if let json =
try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{
//Implement your logic
print(json)
}
} catch {
print("error in JSONSerialization")
}
} else {
print(error!.localizedDescription)
}
})
task.resume()
Run Code Online (Sandbox Code Playgroud)
当我在我的自签名测试服务器上运行它时,我得到:
The certificate for this server is invalid. You might be connecting to a server that is pretending to be “10.0.0.51” which could put your confidential information at risk.
Run Code Online (Sandbox Code Playgroud)
所以我想做的是在测试时接受所有证书,而不是在生产中。
我发现了几个网站,如:
http://www.byteblocks.com/Post/Use-self-signed-SSL-certificate-in-iOS-application https://github.com/socketio/socket.io-client-swift/issues/326
但这些似乎早于 swift 3。
我该如何解决这个问题?
经过大量研究,我了解了代理如何在 swift 3 中使用 URLSession 对象。发布链接的部分太多了,但最后,这是最有帮助的:https : //gist.github.com/stinger/420107a71a02995c312036eb7919e9f9
所以,为了解决这个问题,我从 URLSessionDelegate 继承了我的类,然后添加了以下函数:
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
//accept all certs when testing, perform default handling otherwise
if webService.isTesting() {
print("Accepting cert as always")
completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
else {
print("Using default handling")
completionHandler(.performDefaultHandling, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}
}
Run Code Online (Sandbox Code Playgroud)
isTesting() 调用确定我是否使用测试服务器,然后如果我们处于测试模式,我们接受所有证书。
| 归档时间: |
|
| 查看次数: |
6248 次 |
| 最近记录: |