Я использую 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?