Swift: ошибка доверия TIC SSL при загрузке самозаверяющего URL в WebView - PullRequest
0 голосов
/ 08 января 2019

Я пытался загрузить самозаверяющий URL-адрес внутри Webview в приложении для iOS. Другие URL отлично загружаются в моем веб-просмотре.

Я добавил в свой файл info.plist, но получил ошибку: -

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

А вот и моя полная ошибка: -

2019-01-08 12: 26: 52.386721 + 0530 Демонстрация веб-просмотра [761: 27005] TIC SSL Trust Ошибка [2: 0x282e90480]: 3: 0

2019-01-08 12: 26: 52.405216 + 0530 Демонстрация веб-просмотра [761: 27005] Ошибка загрузки NSURLSession / NSURLConnection HTTP (kCFStreamErrorDomainSSL, -9807)

2019-01-08 12: 26: 52.405283 + 0530 Демонстрация веб-просмотра [761: 27005] Задача . <0> Ошибка загрузки HTTP (ошибка код: -1202 [3: -9807])

2019-01-08 12: 26: 52.405519 + 0530 Демонстрация веб-просмотра [761: 27003] Соединение NSURLC завершено с ошибкой - код -1202

Я новичок в iOS, пожалуйста, помогите мне понять и решить проблему.

Вот мой ViewController: -

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "https://stackoverflow.com")

        if let unwrappedUrl = url{
            let request = URLRequest(url : unwrappedUrl)
            let session = URLSession.shared
            let task = session.dataTask(with: request) { (data, response , error) in
                if error == nil {
                    DispatchQueue.main.async {
                         self.webView.loadRequest(request)
                    }
                }
            }

            task.resume()
        }
    }
}

1 Ответ

0 голосов
/ 08 января 2019

Все, что вам нужно сделать, это добавить некоторые элементы кодирования вместо добавления ключей - значение в Info.plist

let serverTrustPolicies: [String: ServerTrustPolicy] = [ "ваш сайт": .disableEvaluation ]

Добавьте вышеуказанный материал в свой менеджер сессий.

var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling

Если вы используете alamofire их, вы можете использовать следующий метод,

func urlSession(
        _ session: URLSession,
        task: URLSessionTask,
        didReceive challenge: URLAuthenticationChallenge,
        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
{
    var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
    var credential: URLCredential?

    if let taskDidReceiveChallenge = taskDidReceiveChallenge {
        (disposition, credential) = taskDidReceiveChallenge(session, task, challenge)
    } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        let host = challenge.protectionSpace.host

        if
            let serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicy(forHost: host),
            let serverTrust = challenge.protectionSpace.serverTrust
        {
            if serverTrustPolicy.evaluate(serverTrust, forHost: host) {
                disposition = .useCredential
                credential = URLCredential(trust: serverTrust)
            } else {
                disposition = .cancelAuthenticationChallenge
            }
        }
    } else {
        if challenge.previousFailureCount > 0 {
            disposition = .rejectProtectionSpace
        } else {
            credential = self.credential ?? session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)

            if credential != nil {
                disposition = .useCredential
            }
        }
    }

    completionHandler(disposition, credential)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...