ios dom uiwebview web-sql wkwebview

ios - WKWebView proporciona SecurityError al agrupar html y javascript con la aplicación



dom uiwebview (3)

Estamos tratando de migrar una aplicación híbrida de UIWebView (iOS <8) a WKWebView (iOS 8), pero estamos obteniendo SecurityErrors cuando intentamos almacenar cosas usando la API de DOM WebDatabase (es decir, ''bases de datos web sql'').

Lo siguiente arroja un error si index.html se ha cargado desde un archivo empaquetado con la aplicación

// throws SecurityError: DOM Exception 18 var db = openDatabase(''mydb'', ''1.0'', ''key value store'', 1);

El mismo código funciona bien con UIWebView. Puedo recurrir a la utilización de almacenamiento local por alguna razón, pero el uso de bases de datos WebSQL es un no ir. Solo puedo especular que esto tiene algo que ver con la misma política de origen o algo relacionado.

Lo curioso es que cargar index.html desde la red funciona bien: - /

¿Alguna pista sobre cómo puedo evitar esto? ¿Alguna opción para configurar en el WKWebView que lo arregla?

Así es como cargamos las cosas relacionadas con la web:

NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]; NSURL *baseURL = [NSURL fileURLWithPath:htmlPath]; NSURLRequest *request = [NSURLRequest requestWithURL:baseURL]; WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; [config.userContentController addScriptMessageHandler:self.myCallbacks name:@"NativeApp"]; self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config]; [self.webView loadRequest:request];

El archivo html simplemente carga un archivo javascript que tiene una ruta relativa, "myCode.js".


He hecho un ''complemento'' que le permite usar WebSQL (más una implementación de este) en WKWebView. Se puede encontrar aquí

https://github.com/ajwhiteway/WKWebSQL

import WKWebSQL . . . var webView = WKWebView(frame: view.frame, configuration: WKWebViewConfiguration()) WKWebSQL.LoadPlugin(webView)

Para cargarlo en la página. Las versiones no son realmente compatibles en este momento. Siéntase libre de agregarlo.


Puede solucionar esto agregando el siguiente método al UIDelegate de su WKWebView.

- (void) _webView:(WKWebView *)webView decideDatabaseQuotaForSecurityOrigin:(WKSecurityOrigin *)securityOrigin currentQuota:(unsigned long long)currentQuota currentOriginUsage:(unsigned long long)currentOriginUsage currentDatabaseUsage:(unsigned long long)currentUsage expectedUsage:(unsigned long long)expectedUsage decisionHandler:(void (^)(unsigned long long newQuota))decisionHandler { decisionHandler(1024*1024*50); //default to 50MB }

Le da a todas las bases de datos una cuota de 50 MB, en lugar del valor predeterminado de 0, que les permite abrirse. Este comportamiento no está documentado, por lo que no sé dónde se encuentra Apple con esto.

Además, parece que este problema se solucionará en iOS 10.


Existe un problema ( OpenRadar ) con WKWebView en iOS 8.0 (y 8.1 B1, creo) que impide que cargue archivos locales. También podría estar afectando el almacenamiento local. Vea esta pregunta para más detalles.