WKWebView и NSURLProtocol не работают
При использовании старого UIWebView вы можете поймать запросы, выполнив пользовательский NSURLProtocol. Я использую это для обработки запросов, требующих проверки подлинности.
Я попробовал тот же код и не работает с новым WKWebView, но мой класс протокола вообще не вызывается. Кто-то испытывает ту же проблему или есть лучший способ сделать аутентификацию с помощью WKWebView?
Без каких-либо изменений я получаю ответ 401 в функции делегата solvePolicyForNavigationResponse. Я также попытался подключиться к серверу с NSURLConnection и обработать аутентификацию с помощью NSURLConnectionDataDelegate. Это работает, но хранимые учетные данные не подхватываются WKWebView.
Ответы
Ответ 1
Обновленный ответ для iOS 11 и macOS 10.13
Начиная с iOS 11 можно объявить объект, который соответствует протоколу WKURLSchemeHandler
, и зарегистрировать его в конфигурации WKWebView
: -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]
.
Старый ответ
WKWebView
выполняет запросы и выводит контент вне процесса, что означает, что ваше приложение не слышит запросы, которые они делают. Если вам не хватает функциональности, сейчас самое время открыть отчет об ошибках и/или запрос на улучшение в Apple.
Начиная с iOS 10.3 SDK, WKWebView
по-прежнему не может использовать пользовательский NSURLProtocol
с использованием общедоступных API.
Предприимчивые разработчики нашли интересный метод: +[WKBrowsingContextController registerSchemeForCustomProtocol:]
Предположительно, он добавляет предоставленную схему в список обработанных схем пользовательских протоколов и затем должен работать с NSURLProtocol
.
Ответ 2
WKWebView
имеет свойство navigationDelegate
. Если этот делегат установлен, WKWebView
вызовет метод didReceiveAuthenticationChallenge
для этого делегата, если этот метод будет реализован. Вы должны поместить свой код аутентификации в этот метод. Пример:
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"bob"
password:@"pass"
persistence:NSURLCredentialPersistenceNone];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
Ответ 3
Попробуйте использовать этот подход: https://github.com/WildDylan/WKWebViewWithURLProtocol/tree/master/Example/WKWebViewWithURLProtocol
Он может использовать частный API - я не уверен;)
Ответ 4
Если вы используете URLProtocol только для аутентификации, есть еще один способ добиться этого.
Как и когда u получил код ошибки -1202 из didFailLoad и сделал URLConnection для аутентификации, перезагрузите страницу после.
На самом деле мне нужно использовать URLProtocol с WKWebView, lol ~
Ответ 5
Я хочу добавить пользовательские заголовки HTTP ко всем запросам (AJAX и т.д.) В WebView. Как настроить заголовки в WKWebView?