Comment charger le fichier html local dans UIWebView

165

J'essaye de charger un fichier html dans mon UIWebView mais cela ne fonctionnera pas. Voici l'étape: j'ai un dossier appelé html_files dans mon projet. Ensuite, j'ai créé une vue Web dans le générateur d'interface et lui ai attribué une prise dans le viewController. Voici le code que j'utilise pour ajouter le fichier html:

-(void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    [super viewDidLoad];
}

Cela ne fonctionnera pas et l'UIWebView est vide. J'apprécierais de l'aide.

madcoderz
la source

Réponses:

272

il est probablement préférable d'utiliser NSString et de charger le document html comme suit:

Objectif c

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:htmlString baseURL: [[NSBundle mainBundle] bundleURL]];

Rapide

let htmlFile = NSBundle.mainBundle().pathForResource("fileName", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: NSUTF8StringEncoding)
webView.loadHTMLString(html!, baseURL: nil) 

Swift 3 a quelques changements:

let htmlFile = Bundle.main.path(forResource: "intro", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
webView.loadHTMLString(html!, baseURL: nil)

As-tu essayé?

Vérifiez également que la ressource a été trouvée par pathForResource:ofType:inDirectoryappel.

user478681
la source
Cela n'a pas fonctionné, j'ai fait NSLog (@ "% @", htmlFile); juste pour vérifier et il dit null.
madcoderz
Donc, cette ressource moyenne introuvable. Vérifiez avec seulement: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; sans inDirectory
user478681
sans inDirectory, j'ai obtenu: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html mais le html ne s'affichait pas à l'écran, il était toujours vide. Il me manque autre chose? Voici l'exemple de projet: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz
3
il vous suffit de corriger le cadre de votre vue Web
user478681
3
Cette réponse a beaucoup de voix mais semble dépassée. Les images locales et les ressources CSS ne se chargeraient pas avec cette approche. Voyez plutôt cette réponse .
paulmelnikow
90

EDIT 2016-05-27 - loadRequestexpose "une vulnérabilité universelle de Cross-Site Scripting". Assurez-vous de posséder chaque élément que vous chargez. Si vous chargez un mauvais script, il peut charger tout ce qu'il veut.

Si vous avez besoin de liens relatifs pour fonctionner localement, utilisez ceci:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"my" withExtension:@"html"];
[webView loadRequest:[NSURLRequest requestWithURL:url]];

Le bundle recherchera tous les sous-répertoires du projet à trouver my.html. (la structure du répertoire est aplatie au moment de la construction)

Si my.htmla la balise <img src="some.png">, la webView se chargera à some.pngpartir de votre projet.

Neal Ehardt
la source
4
Je n'ai pas pu obtenir la réponse acceptée sur cette page, mais cette approche a fonctionné la première fois. iOS a évolué depuis la réponse originale, je pense. Merci.
James
Merci pour cette réponse. Ce qui est différent à ce sujet par rapport à la réponse acceptée, ce sont les liens dans le travail de documentation HTML.
Amy
2
Selon Apple Pour vous éviter d'être vulnérable aux attaques de sécurité, assurez-vous d'utiliser loadHTMLString: baseURL: pour charger les fichiers HTML locaux; n'utilisez pas loadRequest :.
ED-209
La réponse acceptée ne fonctionne pas pour moi. Merci @neal Ehardt cette réponse fonctionne pour moi.
Mihir Oza du
Cela ne fonctionne que pour moi si le fichier html ne se trouve dans aucun dossier
Renan Franca
40

par cela, vous pouvez charger le fichier html qui se trouve dans vos actifs de projet (bundle) sur webView.

 UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    [web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];

peut-être que cela vous est utile.

AJPatel
la source
c'est la même chose que je fais, la seule différence est que vous créez le webView par programmation. Mais merci quand même
madcoderz
u obtenir le chemin de cette vérification de fichier html par NSLog.
AJPatel
L'appartenance cible du fichier html doit être vérifiée, sinon l'exception suivante sera levée: -Application de clôture en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '*** - [NSURL initFileURLWithPath: isDirectory:]: paramètre de chaîne nil'
Durai Amuthan. H
9

Je suppose que vous devez allocateet lancez votre webviewpremier:

- (void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    webView = [[UIWebView alloc] init];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

    [super viewDidLoad];
}
Saran
la source
8

Un extrait de code simple copier-coller:

-(void)LoadLocalHtmlFile:(NSString *)fileName onWebVu:(UIWebView*)webVu
{
    [webVu loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:fileName ofType:@"html"]isDirectory:NO]]];
}

Remarque:

Assurez-vous que l' appartenance cible du fichier html est cochée, sinon l'exception suivante sera levée: -

entrez la description de l'image ici

Arrêt de l'application en raison d'une exception non interceptée

'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:isDirectory:]: nil string parameter'

Durai Amuthan.H
la source
6

Pour Swift 3 et Swift 4:

let htmlFile = Bundle.main.path(forResource: "name_resource", ofType: "html")
let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
self.webView.loadHTMLString(html, baseURL: nil)
pableiros
la source
Cela ne chargera pas les fichiers liés tels que <img src = "..." />
Pierre F
5
UIWebView *web=[[UIWebView alloc]initWithFrame:self.view.frame];
    //[self.view addSubview:web];
    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"browser_demo" ofType:@"html" inDirectory:nil];
    [web loadRequest:[NSURLRequest requestWhttp://stackoverflow.com/review/first-postsithURL:[NSURL fileURLWithPath:filePath]]];
Raees Valapuram Madathil
la source
4

Peut-être que votre fichier HTML ne prend pas en charge le codage UTF-8, car le même code fonctionne pour moi.

Ou vous pouvez également ces lignes de code:

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"Notes For Apple" ofType:@"htm" inDirectory:nil];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[WebView loadHTMLString:htmlString baseURL:nil];
user1173142
la source
4

Voici comment fonctionne le fichier HTML avec Jquery.

 _webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
    [self.view addSubview:_webview];

    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"jquery" ofType:@"html" inDirectory:nil];

    NSLog(@"%@",filePath);
    NSString *htmlstring=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

    [_webview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
                         or
    [_webview loadHTMLString:htmlstring baseURL:nil];

Vous pouvez utiliser soit les requêtes pour appeler le fichier HTML dans votre UIWebview

Abhilash Reddy kallepu
la source
3

Assurez-vous que "html_files" est un répertoire dans le bundle principal de votre application, et pas seulement un groupe dans Xcode.

ppalancica
la source
3

Une nouvelle façon de faire cela en utilisant swift. UIWebView n'existe plus et WKWebView est la nouvelle classe pour charger les pages Web, ce qui garantit les fonctionnalités de Safari dans la vue Web.

    import WebKit

    let preferences = WKPreferences()
    preferences.javaScriptCanOpenWindowsAutomatically = false

    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences

    let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
    let request = NSURLRequest(URL: NSURL(string: "http://nshipster.com"))
    webView.loadRequest(request)
Govind
la source
3
Swift iOS:

 // get server url from the plist directory
        var htmlFile = NSBundle.mainBundle().pathForResource("animation_bg", ofType: "html")!
        var htmlString = NSString(contentsOfFile: htmlFile, encoding: NSUTF8StringEncoding, error: nil)
        self.webView.loadHTMLString(htmlString, baseURL: nil)
Vinod Joshi
la source
3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Il est peut-être en retard, mais si le fichier pathForResourceest, nilvous devez l'ajouter dans le fichier Build Phases > Copy Bundle Resources.

entrez la description de l'image ici

Atif Imran
la source
2

Voici Swift 3:

    if let htmlFile = Bundle.main.path(forResource: "aa", ofType: "html"){
        do{
            let htmlString = try NSString(contentsOfFile: htmlFile, encoding:String.Encoding.utf8.rawValue )
            messageWebView.loadHTMLString(htmlString as String, baseURL: nil)
        }
        catch _ {
        }
    }
Jonesie
la source
1
if let htmlFile = NSBundle.mainBundle().pathForResource("aa", ofType: "html"){
    do{
        let htmlString = try NSString(contentsOfFile: htmlFile, encoding:NSUTF8StringEncoding )
        webView.loadHTMLString(htmlString as String, baseURL: nil)
    }
    catch _ {
    }
}
ingconti
la source
0

Dans Swift 2.0, la réponse de @ user478681 pourrait ressembler à ceci:

    let HTMLDocumentPath = NSBundle.mainBundle().pathForResource("index", ofType: "html")
    let HTMLString: NSString?

    do {
        HTMLString = try NSString(contentsOfFile: HTMLDocumentPath!, encoding: NSUTF8StringEncoding)
    } catch {
        HTMLString = nil
    }

    myWebView.loadHTMLString(HTMLString as! String, baseURL: nil)
Jean Thomas
la source
mieux utiliser let pour tester contre une erreur dans le chemin / pas de fichier:
ingconti
0

Mettez tous les fichiers (html et ressources) dans un répertoire (pour mon "manuel"). Ensuite, faites glisser et déposez le répertoire vers XCode, sur "Fichiers de support". Vous devez cocher les options "Copier les éléments si nécessaire" et "Créer des références de dossier". Ensuite, écrivez un code simple:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Attention @"manual/index", manuel est le nom de mon annuaire !! C'est tout !!!! Désolé pour mon mauvais anglais...

==================================================== ======================

Hola desde Costa Rica. Ponga los archivos (html y demás recursos) en un directorio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre "Supporting Files". Usted debe seleccionar las opciones "Copier les éléments si nécessaire" et "Créer des références de dossier".

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Presta atención a @"manual/index", manual es el nombre de mi directorio !!

Erick López Alvarado
la source
0

Lorsque votre projet s'agrandit, vous aurez peut-être besoin d'une structure pour que votre page HTML puisse référencer des fichiers situés dans des sous-dossiers.

En supposant que vous faites glisser votre html_filesdossier vers Xcode et que vous sélectionnez l' option Créer des références de dossier , le code Swift suivant garantit que le WKWebViewprend également en charge la structure de dossier résultante:

import WebKit

@IBOutlet weak var webView: WKWebView!

if let path = Bundle.main.path(forResource: "sample", ofType: "html", inDirectory: "html_files") {
    webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
}

Cela signifie que si votre sample.htmlfichier contient une <img src="subfolder/myimage.jpg">balise, le fichier image myimage.jpgdans subfoldersera également chargé et affiché.

Crédits: https://stackoverflow.com/a/8436281/4769344

Pierre F
la source