Cara memuat file html lokal ke UIWebView


165

Saya mencoba memuat file html ke UIWebView saya tetapi tidak berfungsi. Inilah tahapnya: Saya memiliki folder bernama html_files di proyek saya. Lalu saya membuat webView in interface builder dan menetapkan outlet di viewController. Ini adalah kode yang saya gunakan untuk menambahkan 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];
}

Itu tidak akan berfungsi dan UIWebView kosong. Saya menghargai bantuan.

Jawaban:


272

mungkin lebih baik menggunakan NSString dan memuat dokumen html sebagai berikut:

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

Cepat

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

Swift 3 memiliki beberapa perubahan:

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

Apakah kamu sudah mencoba?

Periksa juga apakah sumbernya ditemukan melalui pathForResource:ofType:inDirectorypanggilan.


Itu tidak berhasil, saya lakukan NSLog (@ "% @", htmlFile); hanya untuk memeriksa dan dikatakan nol.
madcoderz

Jadi itu berarti sumber daya tidak ditemukan. Periksa dengan hanya: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; tanpa inDirectory
user478681

tanpa inDirectory saya dapat: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html tetapi html tidak muncul di layar itu masih kosong. Saya kehilangan sesuatu yang lain? Berikut contoh proyeknya: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
Anda hanya perlu memperbaiki bingkai
tampilan

3
Jawaban ini memiliki banyak suara tetapi tampaknya sudah ketinggalan zaman. Aset gambar dan CSS lokal tidak akan dimuat menggunakan pendekatan ini. Lihat jawaban ini sebagai gantinya.
paulmelnikow

90

EDIT 2016-05-27 - loadRequestmemperlihatkan "kerentanan universal Cross-Site Scripting." Pastikan Anda memiliki setiap aset tunggal yang Anda muat. Jika Anda memuat skrip yang buruk, ia dapat memuat apa pun yang diinginkannya.

Jika Anda memerlukan tautan relatif untuk bekerja secara lokal, gunakan ini:

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

Bundel akan mencari semua subdirektori dari proyek yang akan ditemukan my.html. (struktur direktori akan pipih saat membangun)

Jika my.htmlmemiliki tag <img src="some.png">, webView akan dimuat some.pngdari proyek Anda.


4
Saya tidak bisa mendapatkan jawaban yang diterima di halaman ini untuk berfungsi - tetapi pendekatan ini berhasil pertama kali. iOS telah bergerak sejak jawaban awal, saya pikir. Terima kasih.
James

Terima kasih atas jawaban ini. Apa yang berbeda tentang ini vs jawaban yang diterima adalah tautan dalam pekerjaan dokumen HTML.
Amy

2
Menurut Apple Untuk membantu Anda terhindar dari serangan keamanan, pastikan untuk menggunakan loadHTMLString: baseURL: untuk memuat file HTML lokal; jangan gunakan loadRequest :.
ED-209

Jawaban yang diterima tidak berfungsi untuk saya. Terima kasih @neal Ehardt jawaban ini bekerja untuk saya.
Mihir Oza

Ini hanya berfungsi untuk saya jika file html tidak ada di dalam folder apa pun
Renan Franca

40

dengan ini Anda dapat memuat file html yang ada di Aset proyek Anda (bundel) ke 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]]];

Semoga ini bermanfaat bagi Anda.


itu sama dengan yang saya lakukan, satu-satunya perbedaan adalah Anda membuat webView secara terprogram. Tapi terima kasih
madcoderz

Anda mendapatkan jalur pemeriksaan file html oleh NSLog.
AJPatel

Keanggotaan target file html harus diperiksa jika tidak, pengecualian berikut akan dilemparkan: -Terminasi aplikasi karena pengecualian tanpa peringatan 'NSInvalidArgumentException', alasan: '*** - [NSURL initFileURLWithPath: isDirectory:]: nil string parameter'
Durai Amuthan. H

9

Saya kira Anda perlu allocatedan init webviewpertama Anda ::

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

Cuplikan kode Salin-Tempel Sederhana:

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

catatan:

Pastikan keanggotaan Target file html dicentang jika tidak, pengecualian berikut akan dibuang: -

masukkan deskripsi gambar di sini

Mengakhiri aplikasi karena pengecualian tanpa tertangkap

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


6

Untuk Swift 3 dan 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)

Ini tidak akan memuat file yang tertaut seperti <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

Mungkin file HTML Anda tidak mendukung pengkodean UTF-8, karena kode yang sama berfungsi untuk saya.

Atau Anda dapat juga baris kode ini:

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

Berikut cara pengerjaan file HTML dengan 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];

Anda dapat menggunakan salah satu permintaan untuk memanggil file HTML di UIWebview Anda


3

Pastikan "html_files" adalah direktori dalam bundel utama aplikasi Anda, dan bukan hanya grup di Xcode.


3

Cara baru untuk melakukan ini menggunakan swift. UIWebView tidak lebih dan WKWebView adalah kelas baru untuk memuat halaman web, yang memastikan fitur-fitur Safari untuk tampilan 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"];

Mungkin terlambat tetapi jika file dari pathForResourceadalah nilAnda harus menambahkannya di Build Phases > Copy Bundle Resources.

masukkan deskripsi gambar di sini


2

Inilah 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

Di Swift 2.0, jawaban @ user478681 mungkin terlihat seperti ini:

    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)

lebih baik menggunakan biarkan untuk menguji terhadap kesalahan di path / tidak ada file:
ingconti

0

Masukkan semua file (html dan sumber daya) ke direktori (untuk "manual" saya). Selanjutnya, seret dan lepas direktori ke XCode, melalui "File Pendukung". Anda harus memeriksa opsi "Salin Item jika perlu" dan "Buat referensi folder". Selanjutnya, tulis kode sederhana:

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

Perhatian pada @"manual/index", manual adalah nama direktori saya !! Semuanya !!!! Maaf untuk bahasa Inggris saya yang buruk ...

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

Hola desde Kosta Rika. Tidak ada arsip (html and demurs recursos) di un directorio (manual en mi caso lo llamé), tetapi, untuk beberapa kode XCode, jadi "Mendukung File". Gunakan opsi ini untuk menyalin "Salin Item jika perlu" y "Buat referensi folder".

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

Lihat di sini @"manual/index", manual dari es dan direktur !!


0

Saat proyek Anda bertambah besar, Anda mungkin memerlukan beberapa struktur, sehingga halaman HTML Anda dapat mereferensikan file yang terletak di subfolder.

Dengan asumsi Anda menyeret html_filesfolder Anda ke Xcode dan memilih opsi Buat referensi folder , kode Swift berikut memastikan bahwa WKWebViewdukungan juga merupakan struktur folder yang dihasilkan:

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

Ini berarti bahwa jika sample.htmlfile Anda berisi <img src="subfolder/myimage.jpg">tag, maka file gambar myimage.jpgdi subfolderjuga akan dimuat dan ditampilkan.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.