Para iOS 8 anteriores betas, cargar una aplicación web local (en paquete) y funciona bien para ambos UIWebView
y WKWebView
, e incluso he portado un juego web usando la nueva WKWebView
API.
var url = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("car", ofType:"html"))
webView = WKWebView(frame:view.frame)
webView!.loadRequest(NSURLRequest(URL:url))
view.addSubview(webView)
Pero en la versión beta 4, acabo de recibir una pantalla en blanco en blanco ( UIWebView
todavía funciona), parece que no hay nada cargado o ejecutado. Vi un error en el registro:
No se pudo crear una extensión de sandbox para /
¿Alguna ayuda para guiarme en la dirección correcta? ¡Gracias!
Respuestas:
¡Finalmente resolvieron el error! Ahora podemos usar
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Aparentemente, la solución valió unos segundos en el video 504 de WWDC 2015 que presenta Safari View ControllerPara iOS8 ~ iOS10 (Swift 3)
Como dice la respuesta de Dan Fabulish, este es un error de WKWebView
que aparentemente no se está resolviendo en elcortoplazoy, como dijo, hay una solución alternativa :)Estoy respondiendo solo porque quería mostrar el trabajo aquí. El código IMO que se muestra en https://github.com/shazron/WKWebViewFIleUrlTest está lleno de detalles no relacionados que a la mayoría de las personas probablemente no les interese.
La solución es de 20 líneas de código, manejo de errores y comentarios incluidos, sin necesidad de un servidor :)
Y se puede usar como:
fuente
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView no puede cargar contenido del archivo: URL a través de su
loadRequest:
método. http://www.openradar.me/18039024Puede cargar contenido a través de
loadHTMLString:
, pero si su baseURL es un archivo: URL, entonces todavía no funcionará.iOS 9 tiene una nueva API que hará lo que quieras
[WKWebView loadFileURL:allowingReadAccessToURL:]
,.Hay una solución para iOS 8 , demostrada por shazron en Objective-C aquí https://github.com/shazron/WKWebViewFIleUrlTest para copiar archivos
/tmp/www
y cargarlos desde allí .Si está trabajando en Swift, puede probar la muestra de nachos4d en su lugar. (También es mucho más corto que la muestra de shazron, por lo que si tiene problemas con el código de shazron, inténtelo).
fuente
/tmp/www/
. UseNSTemporaryDirectory()
yNSFileManager
para crear elwww
directorio (porque no existe dicho directorio por defecto). Luego copie su archivo allí y ahora lea este archivo :)Un ejemplo de cómo usar [WKWebView loadFileURL: allowReadAccessToURL:] en iOS 9 .
Cuando mueva la carpeta web a un proyecto, seleccione "Crear referencias de carpeta"
Luego use un código similar a este (Swift 2):
En el archivo html, use rutas de archivo como esta
así no
Un ejemplo de directorio que se mueve a un proyecto xcode.
fuente
Solución temporal: estoy usando GCDWebServer , como lo sugiere GuidoMB.
Primero encuentro la ruta de mi carpeta "www /" incluida (que contiene un "index.html"):
... luego comience así:
Para detenerlo:
El rendimiento parece estar bien, incluso en un iPad 2.
Noté un bloqueo después de que la aplicación pasa a un segundo plano, así que la detuve
applicationDidEnterBackground:
yapplicationWillTerminate:
; Lo inicio / reinicioapplication:didFinishLaunching...
yapplicationWillEnterForeground:
.fuente
WKWebView
proporcionaUIWebView
. También podría seguir con la antigua API hasta que se solucione.Esto resolvió el problema para mí iOS 8.0+ dev.apple.com
También esto parece funcionar bien también ...
fuente
allowFileAccessFromFileURLs
enfoque fallaNSUnknownKeyException
.Además de las soluciones mencionadas por Dan Fabulich, XWebView es otra solución alternativa. [WKWebView loadFileURL: allowReadAccessToURL:] se implementa a través de la extensión .
fuente
No puedo comentar todavía, así que estoy publicando esto como una respuesta separada.
Esta es una versión objetiva-c de la solución de nacho4d . La mejor solución que he visto hasta ahora.
fuente
En el caso de que intente mostrar una imagen local en el medio de una cadena HTML más grande como:
<img src="file://...">
todavía no aparece en el dispositivo, así que cargué el archivo de imagen en NSData y pude mostrarlo reemplazando la cadena src con Los datos en sí. Código de muestra para ayudar a construir la cadena HTML para cargar en WKWebView, donde el resultado es lo que reemplazará lo que está dentro de las comillas de src = "":Rápido:
C objetivo:
fuente
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
como<img>
dentro de una cadena HTML.Estoy usando el siguiente. Tengo algunas cosas adicionales en las que estoy trabajando, pero puedes ver dónde he comentado la loadRequest y estoy sustituyendo la llamada loadHTMLString. Espero que esto ayude hasta que arreglen el error.
fuente
Para quién debe solucionar este problema en iOS8:
Si su página no es complicada, puede optar por hacer la página como una aplicación de página única.
En otras palabras, para incrustar todos los recursos en el archivo html.
Para hacer: 1. copie el contenido de su archivo js / css en / tags en el archivo html respectivamente; 2. Convierta sus archivos de imagen en svg para reemplazarlos en consecuencia. 3. cargue la página como antes, usando [webView loadHTMLString: baseURL:], por ejemplo
Era un poco diferente al estilo de una imagen svg, pero no debería bloquearlo tanto.
Parecía que el rendimiento del renderizado de la página disminuyó un poco, pero valió la pena tener una solución tan simple que funcione con iOS8 / 9/10.
fuente
En la misma línea de GCDWebServer, estoy usando SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) y luego loadRequest con el localhost url. Con este enfoque, no tiene que agregar ninguna biblioteca, pero los archivos del sitio web no estarán en el paquete, por lo que no se podrán entregar. Por eso, esto sería más apropiado para los casos de depuración.
fuente
Me las arreglé para usar el servidor web de PHP en OS X. Copiar al directorio temporal / www no funcionó para mí. Python SimpleHTTPServer se quejó de querer leer tipos MIME, probablemente un problema de sandboxing.
Aquí hay un servidor que usa
php -S
:fuente
La solución @ nacho4d es buena. Quiero cambiarlo un poco, pero no sé cómo cambiarlo en tu publicación. Así que lo puse aquí, espero que no te importe. Gracias.
En caso de que tenga una carpeta www, hay muchos otros archivos como png, css, js, etc. Luego debe copiar todos los archivos a la carpeta tmp / www. por ejemplo, tiene una carpeta www como esta:
luego en Swift 2.0:
la función fileURLForBuggyWKWebView8 se copia de @ nacho4d:
fuente
Intenta usar
Parece que todavía está funcionando. Todavía.
fuente