tutorial support raywenderlich previous broken before ios webkit ios8 wkwebview

ios - support - ¿Cómo puedo recuperar un archivo usando WKWebView?



wkwebview navigation swift (5)

En este momento, las instancias de WKWebView ignorarán cualquiera de los almacenes de red predeterminados (NSURLCache, NSHTTPCookieStorage, NSCredentialStorage) y también las clases de redes estándar que puede usar para personalizar las solicitudes de red (NSURLProtocol, etc.).

Por lo tanto, las cookies de la instancia de WKWebView no se almacenan en el almacenamiento de cookies estándar de su aplicación, por lo que NSURLSession / NSURLConnection, que solo utiliza el almacenamiento de cookies estándar, no tiene acceso a las cookies de WKWebView (y probablemente este sea probablemente el problema que tiene: el "estado de inicio de sesión" probablemente se almacena en una cookie, pero NSURLSession / NSURLConnection no verá la cookie).

Lo mismo ocurre con la memoria caché, las credenciales, etc. WKWebView tiene sus propios almacenes privados y, por lo tanto, no funciona bien con las clases de red Cocoa estándar.

Tampoco puede personalizar las solicitudes (agregue sus propios encabezados HTTP personalizados, modifique los encabezados existentes, etc.), use sus propios esquemas de URL personalizados, etc., porque tampoco WKWebView admite NSURLProtocol.

Entonces, en este momento, WKWebView es bastante inútil para muchas aplicaciones, porque no participa con las API de red estándar de Cocoa.

Todavía espero que Apple cambie esto hasta que iOS 8 sea lanzado, porque de lo contrario WKWebView será inútil para muchas aplicaciones, y probablemente nos quedemos con UIWebView un poco más.

Así que envíe informes de errores a Apple, para que Apple sepa que estos problemas son graves y deben corregirse.

Hay un archivo (CSV) que quiero descargar. Está detrás de una pantalla de inicio de sesión en un sitio web. Quería mostrar un WKWebView para permitir que el usuario inicie sesión y luego hacer que la aplicación descargue el archivo después de haber iniciado sesión.

He intentado descargar el archivo fuera de WKWebView después de que el usuario haya iniciado sesión en el sitio web, pero los datos de la sesión parecen estar en la zona de pruebas porque descarga un documento html con el formulario de inicio de sesión en lugar del archivo deseado.

También intenté agregar un WKUserScript al objeto WKUserContentController , pero el script no se ejecuta cuando se carga un archivo que no es HTML.

¿Hay alguna manera de acceder a este archivo mientras los usuarios pueden iniciar sesión a través de WKWebView ?


¿Ha revisado las cookies de respuesta que provienen de la solicitud? Podría usar un método delegado como este.

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL]; for (NSHTTPCookie *cookie in cookies) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; } decisionHandler(WKNavigationResponsePolicyAllow); }


He logrado algo similar a lo que estás tratando de hacer:

  • usa la vista web para iniciar sesión como ya lo estás haciendo
  • establecer un navigationDelegate en su webview
  • implementar -webView:decidePolicyForNavigationResponse:decisionHandler en tu delegado
  • cuando se llama a ese método de delegado (después de que el usuario NSHTTPURLResponse* sesión), puede inspeccionar navigationResponse.response ( NSHTTPURLResponse* a NSHTTPURLResponse* ) y buscar un encabezado Set-Cookie que contenga la información de sesión que necesitará para las sesiones autenticadas.
  • luego puede descargar el archivo CSV al especificar manualmente el encabezado Cookie en su solicitud con las cookies especificadas en la respuesta.

Tenga en cuenta que los métodos de delegado solo se llaman para solicitudes de "marco principal". Lo que significa que las solicitudes AJAX o los marcos internos no lo activarán. Toda la página debe actualizarse para que esto funcione.

Si necesita activar el comportamiento de las solicitudes AJAX, iframes, etc., deberá insertar algún javascript.


Parece que no tengo la cookie de sesión cuando intento una solicitud de userContentController didReceiveScriptMessage.

Sin embargo, cuando se llama desde decidePolicyForNavigationAction, el siguiente código detecta que estoy conectado.

let urlPath: String = "<api endpoint at url at which you are logged in>" let url = NSURL(string: urlPath) let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in let string1 = NSString(data: data, encoding: NSUTF8StringEncoding) println(string1) println(data) if(error != nil) { println("Error sending token to server") // Print any error to the console println(error.localizedDescription) } var err: NSError? }) task.resume()


Puede obtener la cookie a través de Javascript :

A continuación, puede usar la cookie obtenida para descargar el archivo manualmente:

webView.evaluateJavaScript("(function() { return document.cookie })()", completionHandler: { (response, error) -> Void in let cookie = response as! String let request = NSMutableURLRequest(URL: docURL) request.setValue(cookie, forHTTPHeaderField: "Cookie") NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in // Your CSV file will be in the response object }).resume() })