web-dev-qa-db-fra.com

Comment charger un fichier html local dans UIWebView

J'essaie de charger un fichier HTML dans mon UIWebView mais cela ne fonctionnera pas. Voici la scène: j'ai un dossier appelé html_files dans mon projet. Ensuite, j'ai créé WebView dans le générateur d'interface et lui ai attribué une sortie dans le viewController. C'est 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 UIWebView est vide. J'apprécierais un peu d'aide.

163
madcoderz

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

Objective-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 peu de 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 l'appel de pathForResource:ofType:inDirectory.

266
user478681

EDIT 2016-05-27 - loadRequest expose "une vulnérabilité universelle liée aux scripts inter-sites." Assurez-vous vous possédez chaque actif 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 paquet va chercher dans tous les sous-répertoires du projet pour trouver my.html. (la structure de répertoire est aplatie au moment de la construction)

Si my.html porte la balise <img src="some.png">, la WebView chargera some.png à partir de votre projet.

90
Neal Ehardt

vous pouvez ainsi charger le fichier HTML qui se trouve dans les actifs de votre projet dans 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 cela vous est utile.

40
AJPatel

Je suppose que vous devez allocate et initialiser votre webview en premier ::

- (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];
}
9
Saran

n extrait de code Copier-Coller simple:

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

Note:

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

enter image description here

Fermeture de l'application en raison d'une exception non interceptée

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

8
Durai Amuthan.H

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)
6
pableiros
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]]];

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 aussi 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];
4
user1173142

Voici le fonctionnement du 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 les demandes pour appeler le fichier HTML dans votre UIWebview.

4
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)
3
Vinod Joshi
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Cela peut être tardif, mais si le fichier de pathForResource est nil, vous devez l’ajouter dans le Build Phases > Copy Bundle Resources.

enter image description here

3
Atif Imran

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

3
ppalancica

Une nouvelle façon de faire cela en utilisant Swift. UIWebView n'est plus et WKWebView est la nouvelle classe de chargement de pages Web, qui assure les fonctionnalités de Safari à 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)
3
iGo

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 _ {
        }
    }
2
Jonesie
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 _ {
    }
}
1
ingconti

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)
0
Thomas Jeans

Mettez tous les fichiers (html et ressources) dans un répertoire (pour mon "manuel"). Ensuite, faites glisser le répertoire dans XCode, au-dessus de "Fichiers de support". Cochez 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 répertoire !! C'est tout !!!! Désolé pour mon mauvais anglais...

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

Hola du Costa Rica. Cliquez sur le lien suivant (html y demás recursos) pour afficher les instructions du manuel, sélectionnez, gérez et remplacez par XCode, sous la rubrique "Fichiers de support". Vous devez sélectionner les options "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", manuel es el nombre de mon directeur !!

0