Come caricare il file html locale in UIWebView


165

Sto cercando di caricare un file html nel mio UIWebView ma non funzionerà. Ecco la fase: ho una cartella chiamata html_files nel mio progetto. Quindi ho creato un webView nel builder di interfacce e gli ho assegnato un outlet nel viewController. Questo è il codice che sto usando per aggiungere il file 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];
}

Non funzionerà e UIWebView è vuoto. Gradirei un aiuto.

Risposte:


272

probabilmente è meglio usare NSString e caricare il documento html come segue:

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

veloce

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

Swift 3 ha alcune modifiche:

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

Hai provato?

Controlla anche che la risorsa sia stata trovata per pathForResource:ofType:inDirectorychiamata.


Non ha funzionato, ho fatto NSLog (@ "% @", htmlFile); solo per controllare e dice null.
Madcoderz,

Quindi significa che risorsa non trovata. Verificare solo con: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; senza
inDirectory

senza inDirectory ho: iPhone Simulator / 4.3.2 / Applicazioni / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html ma l'html non è stato visualizzato nella schermata era ancora vuoto. Mi sto perdendo qualcos'altro? Ecco il progetto di esempio: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
devi solo correggere il frame della tua visualizzazione web
user478681

3
Questa risposta ha molti voti ma sembra essere obsoleta. L'immagine locale e le risorse CSS non si caricavano con questo approccio. Vedi invece questa risposta .
paulmelnikow,

90

EDIT 2016-05-27 - loadRequestespone "una vulnerabilità universale di cross-site scripting". Assicurati di possedere ogni singola risorsa che carichi. Se carichi uno script errato, può caricare tutto ciò che vuole.

Se hai bisogno di link relativi per funzionare localmente, usa questo:

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

Il bundle cercherà tutte le sottodirectory del progetto da trovare my.html. (la struttura della directory viene appiattita al momento della compilazione)

Se my.htmlha il tag <img src="some.png">, webView verrà caricato some.pngdal tuo progetto.


4
Non sono riuscito a far funzionare la risposta accettata su questa pagina, ma questo approccio ha funzionato per la prima volta. iOS è passato dalla risposta originale, credo. Grazie.
James,

Grazie per questa risposta Ciò che differisce da questo rispetto alla risposta accettata sono i collegamenti nel lavoro del documento HTML.
Amy,

2
Secondo Apple Per aiutarti a evitare di essere vulnerabile agli attacchi di sicurezza, assicurati di usare loadHTMLString: baseURL: per caricare file HTML locali; non usare loadRequest :.
ED-209,

La risposta accettata non funziona per me. Grazie @neal Ehardt questa risposta funziona per me.
Mihir Oza,

Questo funziona solo per me se il file html non si trova in nessuna cartella
Renan Franca,

40

da questo puoi caricare il file html che si trova nel progetto Asset (bundle) su 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]]];

potrebbe essere utile per te.


è lo stesso che sto facendo l'unica differenza è che stai creando il webView a livello di codice. Ma grazie comunque
madcoderz il

ottieni il percorso di quel controllo del file html da NSLog.
AJPatel,

L'appartenenza alla destinazione del file html deve essere verificata, altrimenti verrà generata la seguente eccezione: -App di terminazione a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '*** - [NSURL initFileURLWithPath: isDirectory:]: parametro stringa nullo'
Durai Amuthan. H

9

Immagino che tu debba allocatee iniziare il tuo webviewprimo ::

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

8

Un semplice frammento di codice Copia-Incolla:

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

Nota:

Assicurati che l' appartenenza Target del file html sia selezionata, altrimenti verrà generata la seguente eccezione: -

inserisci qui la descrizione dell'immagine

Terminare l'app a causa di un'eccezione non rilevata

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


6

Per Swift 3 e 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)

Questo non caricherà i file collegati come <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]]];

4

Può essere che il tuo file HTML non supporti la codifica UTF-8, perché lo stesso codice funziona per me.

Oppure puoi anche queste righe di codice:

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

Ecco come funziona il file HTML con 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];

Puoi utilizzare entrambe le richieste per chiamare il file HTML in UIWebview


3

Assicurati che "html_files" sia una directory nel pacchetto principale dell'app e non solo un gruppo in Xcode.


3

Un nuovo modo per farlo usando swift. UIWebView non esiste più e WKWebView è la nuova classe per il caricamento di pagine Web, che garantisce le funzionalità di Safari nella visualizzazione 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
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
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Potrebbe essere tardi, ma se il file da pathForResourceè nildovresti aggiungerlo in Build Phases > Copy Bundle Resources.

inserisci qui la descrizione dell'immagine


2

Ecco 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 _ {
        }
    }

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 _ {
    }
}

0

In Swift 2.0, la risposta di @ user478681 potrebbe apparire così:

    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)

meglio usare lascia testare contro errore nel percorso / nessun file:
ingconti

0

Metti tutti i file (html e risorse) in una directory (per il mio "manuale"). Quindi, trascina e rilascia la directory su XCode, su "File di supporto". È necessario selezionare le opzioni "Copia elementi se necessario" e "Crea riferimenti a cartelle". Quindi, scrivi un semplice codice:

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

Attenzione @"manual/index", manuale è il nome della mia directory !! È tutto !!!! Scusa per il mio cattivo inglese...

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

Hola desde Costa Rica. Ponga los archivos (html y demás recursos) in un directorio (nel mio caso lo llamé manual), luego, arrastre y suelte in XCode, quindi "Supporting Files". Usted debe seleccionar las opciones "Copia elementi se necessario" y "Crea riferimenti a cartelle".

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 !!


0

Quando il tuo progetto diventa più grande, potresti aver bisogno di una struttura, in modo che la tua pagina HTML possa fare riferimento a file situati in sottocartelle.

Supponendo che trascini la html_filescartella su Xcode e selezioni l' opzione Crea riferimenti a cartelle , il seguente codice Swift garantisce che WKWebViewsupporti anche la struttura di cartelle risultante:

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

Ciò significa che se il sample.htmlfile contiene un <img src="subfolder/myimage.jpg">tag, verrà caricato e visualizzato anche il file immagine myimage.jpgin subfolder.

Crediti: https://stackoverflow.com/a/8436281/4769344

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.