私はサーバーへのポストコールを作成していますが、サーバー証明書が無効であるというエラーが続いていましたので、調査した後、これは完全にうまくいく(私は認証の挑戦をプリントしてそれを確認する)が、コールの残りの部分は通過せず、私のサーバーから情報を得ることができない、認証チャレンジの後に何も起こらない、通常は返されるデータ。しかし、何も起こりませんし、私のurlsessiondatadelegatesのどれも呼ばれません(休憩でチェック)。URLSessionデリゲートは認証チャレンジ後に呼び出されません
誰でもその理由を特定できますか?コード:
var request = URLRequest(url: URL(string: "https://45.56.105.97:7915/search-v2")!)
request.httpMethod = "POST"
request.addValue("Basic ***********", forHTTPHeaderField: "Authorization")
let task = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue.main)
task.dataTask(with: request) { (data, response, error) in
print(error)
print(data)
if let responseData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){
print("data: \(responseData)")
self.parseXML(data!)
}
}.resume()
デリゲートメソッド:実行した後
func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
print("did autherntcationchallenge = \(challenge.protectionSpace.authenticationMethod)")
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
print("send credential Server Trust")
let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
challenge.sender!.use(credential, for: challenge)
}else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic{
print("send credential HTTP Basic")
let defaultCredentials: URLCredential = URLCredential(user: "username", password: "password", persistence:URLCredential.Persistence.forSession)
challenge.sender!.use(defaultCredentials, for: challenge)
}else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM{
print("send credential NTLM")
} else{
challenge.sender!.performDefaultHandling!(for: challenge)
}
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
print("Data received: \(data)")
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
print("Response received: \(response)")
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
print("something went wrong: \(error)")
}
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {
print("rep: \(response)")
}
、私が印刷されますすべてがある:autherntcationchallenge = NSURLAuthenticationMethodServerTrust 私も見てきた信用証明書サーバのトラスト
を
送りましたどのようにデータを取得するためのクロージャーメソッドまたはデリゲートメソッドのみを使用することができるかについての会話/両方ではありません。私は成功なしですべてを試しました。
**また、私は盲目的にサーバーを信頼するべきではないことを知っていますが、データを受信できない理由を理解しようとしています。これは重大なセキュリティ上の欠陥があることを認識しています。
これらのデリゲートメソッドが完了ハンドラを提供するときは、その完了ハンドラを呼び出す必要があり、または他の接続は進まないだろう。 – Rob
"urlsessiondatadelegates"が呼び出されたかどうかは、呼び出されたらコードを共有してください? –