J'ai une application iOS très simple avec uiwebview qui charge une page de test très simple (test.html):
<html>
<body>
<img src="img/myimage.png" />
</body>
</html>
Je charge ce fichier test.html dans ma vue Web:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
[webView loadHTMLString:html baseURL:baseUrl];
Cela fonctionne bien si je référence l'image sans le chemin relatif et que je mets l'image référencée dans le chemin racine sous Cibles -> Copier les ressources d'ensemble dans XCode, mais je ne parviens pas à le faire fonctionner avec le chemin relatif, comme indiqué dans mon fichier html. . Il doit y avoir un moyen de le faire, j'ai beaucoup d'images, de css, de fichiers javascript que je veux charger dans la webview et je voudrais ne pas avoir tout à la racine et changer toutes les références de mon web app.
Voici comment charger/utiliser un code HTML local avec des références relatives.
Utilisez le code donné ci-dessous. Cela devrait fonctionner comme un charme.
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
[webview loadRequest:[NSURLRequest requestWithURL:url]];
Maintenant, tous vos liens relatifs (comme img/. Gif, js/. Js) dans le code HTML devraient être résolus.
Swift
if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") {
webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
}
En rapide:
func pathForResource( name: String?,
ofType ext: String?,
inDirectory subpath: String?) -> String? {
// **name:** Name of Hmtl
// **ofType ext:** extension for type of file. In this case "html"
// **inDirectory subpath:** the folder where are the file.
// In this case the file is in root folder
let path = NSBundle.mainBundle().pathForResource( "dados",
ofType: "html",
inDirectory: "root")
var requestURL = NSURL(string:path!)
var request = NSURLRequest(URL:requestURL)
webView.loadRequest(request)
}
Je fais simplement ceci:
UIWebView *webView = [[[UIWebView alloc] init] autorelease];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
Où "index.html" fait relativement référence aux images, CSS, javascript, etc.
J'ai tout entassé dans une seule ligne (dommage que je sache) et je n'ai eu aucun problème avec ça:
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test"
ofType:@"html"]
isDirectory:NO]]];
Réponse rapide 2.
Le référence de la classe UIWebView déconseille l'utilisation de webView.loadRequest (request):
N’utilisez pas cette méthode pour charger des fichiers HTML locaux; utilisez plutôt loadHTMLString: baseURL :.
Dans cette solution, le code HTML est lu dans une chaîne. L'URL du HTML est utilisé pour déterminer le chemin, et le passe comme une URL de base.
let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)
Je suis retourné et testé et re-testé cela, il semble que la seule façon que je peux le faire fonctionner (car j'ai des fichiers dans le dossier img et certains dans js/css, etc ...) est de ne pas utiliser un chemin relatif à mon image dans le HTML et avoir tout référencé dans le dossier bundle. C'est dommage :(.
<img src="myimage.png" />
La réponse de @ sdbrain dans Swift 3:
let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!)
webView.loadRequest(NSURLRequest.init(url: url) as URLRequest)