Подтвердить что ты не робот

WKWebView и NSURLProtocol не работают

При использовании старого UIWebView вы можете поймать запросы, выполнив пользовательский NSURLProtocol. Я использую это для обработки запросов, требующих проверки подлинности.

Я попробовал тот же код и не работает с новым WKWebView, но мой класс протокола вообще не вызывается. Кто-то испытывает ту же проблему или есть лучший способ сделать аутентификацию с помощью WKWebView?

Без каких-либо изменений я получаю ответ 401 в функции делегата solvePolicyForNavigationResponse. Я также попытался подключиться к серверу с NSURLConnection и обработать аутентификацию с помощью NSURLConnectionDataDelegate. Это работает, но хранимые учетные данные не подхватываются WKWebView.

4b9b3361

Ответ 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);
}

Ответ 4

Если вы используете URLProtocol только для аутентификации, есть еще один способ добиться этого.

Как и когда u получил код ошибки -1202 из didFailLoad и сделал URLConnection для аутентификации, перезагрузите страницу после.

На самом деле мне нужно использовать URLProtocol с WKWebView, lol ~

Ответ 5

Я хочу добавить пользовательские заголовки HTTP ко всем запросам (AJAX и т.д.) В WebView. Как настроить заголовки в WKWebView?