Para anteriores iOS 8 betas, carregar um aplicativo web local (em Bundle) e funciona bem para ambos UIWebView
e WKWebView
, e eu até portado um jogo web usando a nova 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)
Mas na versão beta 4, recebi uma tela branca em branco ( UIWebView
ainda funciona), parece que nada foi carregado ou executado. Eu vi um erro no log:
Não foi possível criar uma extensão de sandbox para /
Alguma ajuda para me guiar na direção certa? Obrigado!
Respostas:
Eles finalmente resolveram o bug! Agora podemos usar
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Aparentemente, a correção valeu alguns segundos no vídeo 504 da WWDC 2015.Para iOS8 ~ iOS10 (Swift 3)
Como a resposta de Dan Fabulish afirma, este é um bug do WKWebView
que aparentemente não está sendo resolvidotãocedoe, como ele disse, há umasoluçãoalternativa :)Estou respondendo apenas porque queria mostrar a solução aqui. O código IMO mostrado em https://github.com/shazron/WKWebViewFIleUrlTest está cheio de detalhes não relacionados nos quais a maioria das pessoas provavelmente não está interessada.
A solução alternativa é 20 linhas de código, tratamento de erros e comentários incluídos, sem a necessidade de um servidor :)
E pode ser usado como:
fonte
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
O WKWebView não pode carregar o conteúdo do arquivo: URLs através de seu
loadRequest:
método. http://www.openradar.me/18039024Você pode carregar o conteúdo via
loadHTMLString:
, mas se a sua baseURL for um arquivo: URL, ele ainda não funcionará.O iOS 9 possui uma nova API que fará o que você deseja
[WKWebView loadFileURL:allowingReadAccessToURL:]
,.Existe uma solução alternativa para o iOS 8 , demonstrada pelo shazron no Objective-C aqui https://github.com/shazron/WKWebViewFIleUrlTest para copiar arquivos
/tmp/www
e carregá-los a partir daí .Se você estiver trabalhando no Swift, tente a amostra do nachos4d . (Também é muito mais curto que a amostra do shazron, por isso, se você estiver tendo problemas com o código do shazron, experimente.)
fonte
/tmp/www/
. UseNSTemporaryDirectory()
eNSFileManager
para criar owww
diretório (porque não existe esse diretório por padrão). Em seguida, copie o arquivo lá e agora ler este arquivo :)Um exemplo de como usar [WKWebView loadFileURL: allowReadAccessToURL:] no iOS 9 .
Ao mover a pasta da web para um projeto, selecione "Criar referências de pasta"
Em seguida, use um código parecido com este (Swift 2):
No arquivo html, use caminhos de arquivo como este
Assim não
Um exemplo de diretório que é movido para um projeto xcode.
fonte
Solução temporária: estou usando o GCDWebServer , conforme sugerido pelo GuidoMB.
Encontrei o caminho da minha pasta "www /" empacotada (que contém um "index.html"):
... então inicie-o assim:
Para pará-lo:
O desempenho parece bom, mesmo em um iPad 2.
Eu notei uma falha depois que o aplicativo entra em segundo plano, então eu o interrompo
applicationDidEnterBackground:
eapplicationWillTerminate:
; Eu inicio / reinicioapplication:didFinishLaunching...
eapplicationWillEnterForeground:
.fonte
WKWebView
oferecem maisUIWebView
. É melhor ficar com a API antiga até que isso seja corrigido.Isso resolveu o problema para mim iOS 8.0+ dev.apple.com
também isso parece funcionar muito bem também ...
fonte
allowFileAccessFromFileURLs
abordagem falhaNSUnknownKeyException
.Além das soluções mencionadas por Dan Fabulich, o XWebView é outra solução alternativa. [WKWebView loadFileURL: allowReadAccessToURL:] é implementado através da extensão .
fonte
Ainda não posso comentar, por isso estou postando isso como uma resposta separada.
Esta é uma versão objetiva-c da solução do nacho4d . A melhor solução alternativa que eu já vi até agora.
fonte
No caso de você estar tentando exibir uma imagem local no meio de uma string HTML maior como
<img src="file://...">
:, ela ainda não aparece no dispositivo, então eu carreguei o arquivo de imagem no NSData e pude exibi-la substituindo a string src por os dados em si. Código de amostra para ajudar a criar a string HTML a ser carregada no WKWebView, onde resultado é o que substituirá o que está dentro das aspas de src = "":Rápido:
Objetivo-C:
fonte
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
como<img>
dentro de uma string HTML.Estou usando o abaixo. Tenho algumas coisas extras em que estou trabalhando, mas você pode ver onde comentei o loadRequest e estou substituindo a chamada loadHTMLString. Espero que isso ajude até que eles consertem o bug.
fonte
Para quem deve solucionar esse problema no iOS8:
Se a sua página não for complicada, você pode optar por torná-la como um Aplicativo de Página Única.
Em outras palavras, para incorporar todos os recursos no arquivo html.
Para fazer: 1. copie o conteúdo do seu arquivo js / css para / tags no arquivo html, respectivamente; 2. converta seus arquivos de imagem em svg para substituir de acordo. 3. carregue a página como antes, usando [webView loadHTMLString: baseURL:], por exemplo
Era um pouco diferente de estilizar uma imagem svg, mas não deveria te bloquear tanto.
Parecia que o desempenho de renderização da página diminuía um pouco, mas vale a pena ter uma solução alternativa tão simples funcionando no iOS8 / 9/10.
fonte
Na mesma linha do GCDWebServer, estou usando SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) e, em seguida, loadRequest com o localhost url. Com essa abordagem, você não precisa adicionar nenhuma biblioteca, mas os arquivos do site não estarão no pacote, portanto, não poderá ser entregue. Por isso, isso seria mais apropriado para os casos de depuração.
fonte
Eu consegui usar o servidor da web do PHP no OS X. Copiar para o diretório / www temporário não funcionou para mim. O Python SimpleHTTPServer se queixou de querer ler tipos MIME, provavelmente um problema de sandbox.
Aqui está um servidor usando
php -S
:fonte
@ Solução nacho4d é boa. Quero mudar um pouco, mas não sei como alterá-lo em sua postagem. Então, eu coloquei aqui, espero que você não se importe. obrigado.
Caso você tenha uma pasta www, existem muitos outros arquivos, como png, css, js, etc. Em seguida, você deve copiar todos os arquivos para a pasta tmp / www. por exemplo, você tem uma pasta www como esta:
depois no Swift 2.0:
a função fileURLForBuggyWKWebView8 é copiada de @ nacho4d:
fonte
Tente usar
Parece que ainda está funcionando. Ainda.
fonte