undeclared type support previous example broken before ios uiwebview swift ios8 wkwebview

ios - type - WKWebView y NSURLProtocol no funcionan



wkwebview ios (4)

Al usar el antiguo UIWebView, podría captar las solicitudes implementando un NSURLProtocol personalizado. Esto lo hacemos para manejar solicitudes que requieren autenticación.

Probé el mismo código y no funciona con el nuevo WKWebView pero mi clase de protocolo no se llama en absoluto. ¿Alguien tiene el mismo problema o hay una forma mejor de autenticarse con WKWebView?

Sin modificaciones, obtengo una respuesta 401 en la función de delegado decidePolicyForNavigationResponse. También intenté conectarme al servidor con NSURLConnection y manejar la autenticación con NSURLConnectionDataDelegate. Eso funciona, pero las credenciales almacenadas no son recogidas por WKWebView.


Respuesta actualizada para iOS 11 y macOS 10.13

Desde iOS 11 es posible crear una subclase de WKURLSchemeHandler y registrarla en la configuración de WKWebView : -[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:] .

Respuesta anterior

WKWebView realiza solicitudes y procesa el contenido fuera de proceso, lo que significa que su aplicación no escucha las solicitudes que realizan. Si le falta una funcionalidad, ahora es el momento de abrir un informe de error y / o una solicitud de mejora con Apple.

A partir de iOS 10.3 SDK, WKWebView todavía no puede hacer uso de NSURLProtocol personalizados utilizando API públicas.

Los desarrolladores emprendedores han encontrado un método interesante: +[WKBrowsingContextController registerSchemeForCustomProtocol:] Supuestamente agrega el esquema proporcionado a una lista de esquemas manejados por protocolo personalizado y luego debe trabajar con NSURLProtocol .



Si está utilizando URLProtocol solo para la autenticación, hay otra forma de lograrlo.

Como cuando obtuviste un código de error -1202 de didFailLoad, y haces una URLConnection para hacer la autenticación, vuelve a cargar la página.

En realidad necesito usar URLProtocol con WKWebView también, lol ~


WKWebView tiene una propiedad de navigationDelegate . Si ese delegado está configurado, WKWebView llamará al método didReceiveAuthenticationChallenge en ese delegado si el método se implementa. Debe colocar su código de autenticación en este método. Ejemplo:

- (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); }