Pour les versions bêta précédentes d'iOS 8, chargez une application Web locale (dans Bundle) et cela fonctionne bien pour les deux UIWebView
et WKWebView
, et j'ai même porté un jeu Web à l'aide de la nouvelle 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)
Mais dans la bêta 4, je viens d'avoir un écran blanc vierge ( UIWebView
fonctionne toujours), on dirait que rien n'est chargé ou exécuté. J'ai vu une erreur dans le journal:
Impossible de créer une extension de bac à sable pour /
Une aide pour me guider dans la bonne direction? Merci!
Réponses:
Ils ont finalement résolu le bug! Maintenant, nous pouvons utiliser
-[WKWebView loadFileURL:allowingReadAccessToURL:]
. Apparemment, le correctif valait quelques secondes dans la vidéo de la WWDC 2015 504 Présentation de Safari View ControllerPour iOS8 ~ iOS10 (Swift 3)
Comme l' indique la réponse de Dan Fabulish, il s'agit d'un bogue de WKWebView
qui n'est apparemment pas résolu de sitôtet comme il l'a dit, il y a unesolution:)Je réponds simplement parce que je voulais montrer le contournement ici. Le code IMO affiché sur https://github.com/shazron/WKWebViewFIleUrlTest regorge de détails sans rapport avec la plupart des gens ne sont probablement pas intéressés.
Le contournement est de 20 lignes de code, gestion des erreurs et commentaires inclus, pas besoin d'un serveur :)
Et peut être utilisé comme:
la source
let orgFolder = NSBundle.mainBundle().resourcePath! + "/www"; var newFilePath = pathForBuggyWKWebView(orgFolder) self.loadingWebView!.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(newFilePath!+"/Loading.html")!))
WKWebView ne peut pas charger le contenu du fichier: URL via sa
loadRequest:
méthode. http://www.openradar.me/18039024Vous pouvez charger du contenu via
loadHTMLString:
, mais si votre baseURL est un fichier: URL, cela ne fonctionnera toujours pas.iOS 9 a une nouvelle API qui va faire ce que vous voulez,
[WKWebView loadFileURL:allowingReadAccessToURL:]
.Il existe une solution de contournement pour iOS 8 , démontrée par shazron dans Objective-C ici https://github.com/shazron/WKWebViewFIleUrlTest pour copier des fichiers
/tmp/www
et les charger à partir de là .Si vous travaillez dans Swift, vous pouvez essayer l'exemple de nachos4d à la place. (Il est également beaucoup plus court que l'exemple de shazron, donc si vous rencontrez des problèmes avec le code de shazron, essayez plutôt.)
la source
/tmp/www/
. UtilisezNSTemporaryDirectory()
etNSFileManager
pour créer unwww
répertoire (car il n'y en a pas par défaut). Ensuite, copiez votre fichier là-dedans et maintenant lisez ce fichier :)Un exemple d'utilisation de [WKWebView loadFileURL: allowReadAccessToURL:] sur iOS 9 .
Lorsque vous déplacez le dossier Web vers un projet, sélectionnez "Créer des références de dossier"
Ensuite, utilisez un code similaire à celui-ci (Swift 2):
Dans le fichier html, utilisez des chemins de fichiers comme celui-ci
pas comme ça
Un exemple de répertoire déplacé vers un projet xcode.
la source
Solution temporaire: j'utilise GCDWebServer , comme suggéré par GuidoMB.
Je trouve d'abord le chemin de mon dossier "www /" (qui contient un "index.html"):
... puis démarrez-le comme ceci:
Pour l'arrêter:
Les performances semblent bonnes, même sur un iPad 2.
J'ai remarqué un plantage après que l'application soit passée en arrière-plan, alors je l'ai arrêtée
applicationDidEnterBackground:
etapplicationWillTerminate:
; Je le démarre / le redémarre surapplication:didFinishLaunching...
etapplicationWillEnterForeground:
.la source
WKWebView
procureUIWebView
. Autant s'en tenir à l'ancienne API jusqu'à ce que cela soit corrigé.Cela a résolu le problème pour moi iOS 8.0+ dev.apple.com
cela semble aussi bien fonctionner aussi ...
la source
allowFileAccessFromFileURLs
approche se bloque avecNSUnknownKeyException
.Outre les solutions mentionnées par Dan Fabulich, XWebView est une autre solution de contournement. [WKWebView loadFileURL: allowReadAccessToURL:] est implémenté via l'extension .
la source
Je ne peux pas encore commenter, donc je publie ceci comme une réponse distincte.
Ceci est une version objective-c de la solution de nacho4d . La meilleure solution de contournement que j'ai vue jusqu'à présent.
la source
Dans le cas où vous essayez d'afficher une image locale au milieu d'une chaîne HTML plus grande comme
<img src="file://...">
:, elle n'apparaît toujours pas sur l'appareil, j'ai donc chargé le fichier image dans NSData et j'ai pu l'afficher en remplaçant la chaîne src par les données elles-mêmes. Exemple de code pour aider à créer la chaîne HTML à charger dans WKWebView, où le résultat est ce qui remplacera ce qui se trouve à l'intérieur des guillemets de src = "":Rapide:
Objectif c:
la source
result += "data:image/" + attachmentType + ";base64," + base64String
WKWebView
sous forme<img>
de chaîne HTML.J'utilise le ci-dessous. A des trucs supplémentaires sur lesquels je travaille, mais vous pouvez voir où j'ai commenté le loadRequest et je remplace l'appel loadHTMLString. J'espère que cela aidera jusqu'à ce qu'ils corrigent le bogue.
la source
Pour qui doit contourner ce problème sous iOS8:
Si votre page n'est pas compliquée, vous pouvez choisir de faire de la page une application à page unique.
En d'autres termes, pour intégrer toutes les ressources dans le fichier html.
Pour faire: 1. Copiez respectivement le contenu de votre fichier js / css dans / tags dans le fichier html; 2. convertissez vos fichiers image en svg pour les remplacer en conséquence. 3. chargez la page comme avant, en utilisant [webView loadHTMLString: baseURL:], par exemple
C'était un peu différent du style d'une image svg, mais cela ne devrait pas vous bloquer autant.
Il semblait que les performances de rendu de la page diminuaient un peu, mais il valait la peine d'avoir une solution de contournement aussi simple sous iOS8 / 9/10.
la source
Dans la même ligne de GCDWebServer, j'utilise SImpleHttpServer ( http://www.andyjamesdavies.com/blog/javascript/simple-http-server-on-mac-os-x-in-seconds ) puis loadRequest avec l'hôte local url. Avec cette approche, vous n'avez pas à ajouter de bibliothèque, mais les fichiers du site Web ne seront pas dans le bundle et ne seront donc pas livrables. Pour cette raison, ce serait plus approprié pour les cas de débogage.
la source
J'ai réussi à utiliser le serveur Web de PHP sur OS X. La copie dans le répertoire temporaire / www n'a pas fonctionné pour moi. Le Python SimpleHTTPServer s'est plaint de vouloir lire les types MIME, probablement un problème de sandboxing.
Voici un serveur utilisant
php -S
:la source
La solution @ nacho4d est bonne. Je veux le changer un peu mais je ne sais pas comment le changer dans votre message. Alors je l'ai mis ici, j'espère que cela ne vous dérange pas. Merci.
Dans le cas où vous avez un dossier www, il y a beaucoup d'autres fichiers tels que png, css, js etc. Ensuite, vous devez copier tous les fichiers dans le dossier tmp / www. par exemple, vous avez un dossier www comme celui-ci:
puis dans Swift 2.0:
le fichier de fonctionURLForBuggyWKWebView8 est copié depuis @ nacho4d:
la source
Essayez d'utiliser
Il semble que cela fonctionne toujours. Encore.
la source