web-dev-qa-db-fra.com

Charger des ressources à partir d'un chemin relatif en utilisant du HTML local dans uiwebview

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.

120
Matt Palmerlee

Voici comment charger/utiliser un code HTML local avec des références relatives.

  1. Faites glisser la ressource dans votre projet xcode (j'ai fait glisser un dossier nommé www depuis ma fenêtre du Finder), vous obtiendrez deux options "créer des groupes pour tous les dossiers ajoutés" et "créer des références de dossiers pour tous les dossiers ajoutés".
  2. Sélectionnez l'option "créer des références de dossier ..".
  3. 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)) )
    }
285
sdbrain

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)
}
24
Weles

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.

5
Old McStopher

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]]];         
5
PengOne

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)
2
ThisIsNotMe

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" />
0
Matt Palmerlee

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)
0
skornos