Как UIWebView может посещать ресурсы js / css для html через самозаверяющий сертификат SSL - PullRequest
0 голосов
/ 25 июня 2019

Я использую CocoaHTTPServer, запускающий локальный сервер для предоставления автономных ресурсов js / css / image для веб-страниц.Я использую самозаверяющий SSL-сертификат, чтобы мой локальный сервер поддерживал HTTPS.

В WKWebview веб-представление загружает онлайн-страницу html и извлекает мои автономные ресурсы через href, например «https: localhost: 60000 /путь / файл "отлично.

Но в UIWebView веб-представление не может загрузить страницу.Консольная панель печатает множество ошибок NSURLConnection и SSL, таких как:

"Ошибка доверия SSL TIC [21: 0x600003c2aa00]: 3: 0",
"NSURLConnection завершена с ошибкой - код -1202"

Я прочитал этот вопрос и последовал за ответом, чтобы успешно загрузить страницу UIWebView.Но консольная панель все еще печатает много ошибок, и, используя этот ответ, каждая страница может быть загружена три раза, и я обнаружил, что некоторый API, который я хочу вызвать из H5, может быть вызван только при первой загрузке.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    YJJavaScriptBridgeObject *object = [[YJJavaScriptBridgeObject alloc] init];
    object.delegate = self;
    // H5 use this obj to call native methods to get off-line resource status. 
    context[@"obj"] = object;
    self.context = context;
    NSLog(@"%@", context);

    if (!self.authenticated) {
        self.urlConnection = [NSURLConnection connectionWithRequest:request delegate:self];
        [self.urlConnection start];
        self.request = request;
    }

    return YES;
}
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection {
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if ([challenge previousFailureCount] == 0) {
        self.authenticated = YES;
        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
    } else {
        [challenge.sender cancelAuthenticationChallenge:challenge];
    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    self.authenticated = YES;
    [self.webView loadRequest:self.request];
    [self.urlConnection cancel];
    self.urlConnection = nil;
    self.request = nil;
}

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if (challenge.previousFailureCount == 0) {
        NSURLCredential*credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
    } else {
        [challenge.sender cancelAuthenticationChallenge:challenge];
    }
}

Так что я надеюсь, что есть способ заставить UIWebView посещать самозаверяющий ресурс SSL, как это делал WKWebView.Кто-нибудь сталкивался с такой же проблемой и есть способ ее решить?Или у меня есть лучший способ заставить мой локальный сервер поддерживать HTTPS?

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