cak*_*s88 4 xcode swift ios9 xcode7 swift2
我正在使用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?,
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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)
});
Run Code Online (Sandbox Code Playgroud)
我已经调查过,NSURLAuthenticationChallenge但我似乎无法用我现有的代码来解决这个问题.所以我的问题是如何才能连接到服务器?我已经尝试将域添加到我NSAppTransportSecurity的Info.plist中,但这不起作用.打开NSAllowsArbitraryLoads也不起作用.任何帮助,将不胜感激.
Fra*_*tor 12
看看这篇文章.使用App Transport Security发送应用程序,尤其是有关自签名证书的部分.
你很可能需要表单的委托方法,
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
completionHandler(
.UseCredential,
NSURLCredential(trust: challenge.protectionSpace.serverTrust!)
)
}
Run Code Online (Sandbox Code Playgroud)
将此添加到我自己的使用NSURLSession的comms类中修复了该问题.
小智 6
创建URL会话时,请使用初始化程序,该初始化程序将委托与配置一起设置,如下所示:
let urlSession = URLSession(configuration: urlSessionConfiguration, delegate: self, delegateQueue: nil)
Run Code Online (Sandbox Code Playgroud)
然后,实现以下委托方法,它应该可以工作。
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
let urlCredential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
completionHandler(.useCredential, urlCredential)
}
Run Code Online (Sandbox Code Playgroud)
但是,需要特别注意的是,这是一个安全问题,我们不应该尝试使用无效的证书连接服务器。
打开您的 info.plist 作为源代码添加以下内容:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
这应该有帮助。
| 归档时间: |
|
| 查看次数: |
12212 次 |
| 最近记录: |