Cách tải tệp html cục bộ vào UIWebView


165

Tôi đang cố tải một tệp html vào UIWebView của mình nhưng nó không hoạt động. Đây là giai đoạn: Tôi có một thư mục có tên html_files trong dự án của mình. Sau đó, tôi đã tạo một webView trong trình xây dựng giao diện và gán một ổ cắm cho nó trong viewContoder. Đây là mã tôi đang sử dụng để chắp thêm tệp 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];
}

Điều đó sẽ không hoạt động và UIWebView trống. Tôi đánh giá cao sự giúp đỡ.

Câu trả lời:


272

có lẽ tốt hơn là sử dụng NSString và tải tài liệu html như sau:

Mục tiêu-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]];

Nhanh

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

Swift 3 có một vài thay đổi:

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

Bạn đã thử chưa?

Cũng kiểm tra xem tài nguyên đã được tìm thấy bằng pathForResource:ofType:inDirectorycuộc gọi.


Điều đó không hiệu quả, tôi đã làm NSLog (@ "% @", htmlFile); chỉ để kiểm tra và nó nói null.
madcoderz

Vì vậy, có nghĩa là tài nguyên không được tìm thấy. Kiểm tra chỉ với: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; không có inDirectory
user478681

không có inDirectory tôi đã nhận: iPhone Simulator / 4.3.2 / Ứng dụng / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html nhưng html không hiển thị trong màn hình vẫn còn trống. Tôi đang thiếu thứ gì khác? Đây là dự án mẫu: http://www.box.net/
Shared / rb05b4ppjnbof1r33gh7

3
bạn chỉ cần sửa khung hình
webview

3
Câu trả lời này có rất nhiều phiếu nhưng dường như đã lỗi thời. Các tài sản hình ảnh và CSS cục bộ sẽ không tải bằng cách sử dụng phương pháp này. Xem câu trả lời này thay thế.
paulmelnikow

90

EDIT 2016-05-27 - loadRequestphơi bày "lỗ hổng bảo mật đa trang web phổ biến". Hãy chắc chắn rằng bạn sở hữu mọi tài sản duy nhất mà bạn tải. Nếu bạn tải một tập lệnh xấu, nó có thể tải bất cứ thứ gì nó muốn.

Nếu bạn cần các liên kết tương đối để làm việc tại địa phương, hãy sử dụng:

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

Gói sẽ tìm kiếm tất cả các thư mục con của dự án để tìm my.html. (cấu trúc thư mục được làm phẳng tại thời điểm xây dựng)

Nếu my.htmlcó thẻ <img src="some.png">, webView sẽ tải some.pngtừ dự án của bạn.


4
Tôi không thể có câu trả lời được chấp nhận trên trang này để làm việc - nhưng cách tiếp cận này hoạt động lần đầu tiên. iOS đã chuyển từ câu trả lời ban đầu, tôi nghĩ vậy. Cảm ơn.
James

Cảm ơn câu trả lời này. Điều khác biệt về điều này so với câu trả lời được chấp nhận là các liên kết trong công việc tài liệu HTML.
Amy

2
Theo Apple Để giúp bạn tránh bị tấn công bảo mật, hãy chắc chắn sử dụng loadHTMLString: baseURL: để tải các tệp HTML cục bộ; không sử dụng loadRequest :.
ED-209

Câu trả lời được chấp nhận là không làm việc cho tôi. Cảm ơn @neal Ehardt câu trả lời này có hiệu quả với tôi.
Mihir Oza

Điều này chỉ hoạt động với tôi nếu tệp html không nằm trong bất kỳ thư mục nào
Renan Franca

40

bằng cách này, bạn có thể tải tệp html trong Tài sản dự án (gói) của bạn lên 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]]];

có thể điều này là hữu ích cho bạn.


điều tương tự tôi đang làm khác biệt duy nhất là bạn đang tạo webView theo chương trình. Nhưng dù sao cũng cảm ơn
madcoderz

Bạn có được đường dẫn của tệp html đó bằng NSLog.
AJPatel

Thành viên mục tiêu của tệp html nên được kiểm tra nếu không ngoại lệ sau sẽ bị ném: Ứng dụng kết thúc do ngoại lệ chưa được xử lý 'NSInvalidArgumentException', lý do: '*** - [NSURL initFileURLWithPath: isDirectory:]: nil tham số chuỗi'
Durai Amut. H

9

Tôi đoán bạn cần allocatevà khởi tạo webviewđầu tiên ::

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

Một đoạn mã Copy-Paste đơn giản:

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

Ghi chú:

Đảm bảo rằng tư cách thành viên Target của tệp html được kiểm tra nếu không ngoại lệ sau sẽ bị ném: -

nhập mô tả hình ảnh ở đây

Chấm dứt ứng dụng do ngoại lệ

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


6

Dành cho Swift 3 và 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)

Điều này sẽ không tải các tệp được liên kết, chẳng hạn như <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

Có thể tệp HTML của bạn không hỗ trợ mã hóa UTF-8, vì cùng một mã đang hoạt động với tôi.

Hoặc bạn cũng có thể những dòng mã này:

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

Đây là cách làm việc của tệp HTML với 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];

Bạn có thể sử dụng một trong hai yêu cầu để gọi tệp HTML trong UIWebview của bạn


3

Đảm bảo "html_files" là một thư mục trong gói chính của ứng dụng của bạn và không chỉ là một nhóm trong Xcode.


3

Một cách mới để làm điều này bằng cách sử dụng nhanh chóng. UIWebView không còn nữa và WKWebView là lớp mới để tải các trang web, đảm bảo các tính năng Safari cho chế độ xem 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"];

Nó có thể bị trễ nhưng nếu tập tin từ pathForResourcenilbạn nên thêm nó vào Build Phases > Copy Bundle Resources.

nhập mô tả hình ảnh ở đây


2

Đây là 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

Trong Swift 2.0, câu trả lời của @ user478681 có thể giống như thế này:

    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)

tốt hơn để sử dụng hãy kiểm tra chống lại lỗi trong đường dẫn / không có tệp:
ingconti

0

Đặt tất cả các tệp (html và tài nguyên) trong một thư mục (cho "thủ công" của tôi). Tiếp theo, kéo và thả thư mục vào XCode, qua "Tệp hỗ trợ". Bạn nên kiểm tra các tùy chọn "Sao chép các mục nếu cần" và "Tạo tham chiếu thư mục". Tiếp theo, viết một mã đơn giản:

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

Chú ý @"manual/index", hướng dẫn sử dụng là tên của thư mục của tôi !! Đó là tất cả !!!! Xin lỗi vì tiếng Anh của tôi không tốt...

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

Hola desde Costa Rica. Ponga los archivos (html y demás recursos) en un directorio (en mi caso lo llamé hướng dẫn), luego, Arrayastre y suelte en XCode, sobre "Supporting Files". Usted debe seleccionar las opciones "Sao chép các mục nếu cần" y "Tạo tham chiếu thư mục".

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

Presta atención a @"manual/index", hướng dẫn sử dụng es el nombre de mi directorio !!


0

Khi dự án của bạn trở nên lớn hơn, bạn có thể cần một số cấu trúc để trang HTML của bạn có thể tham chiếu các tệp nằm trong các thư mục con.

Giả sử bạn kéo html_filesthư mục của mình vào Xcode và chọn tùy chọn Tạo thư mục tham chiếu , mã Swift sau đây đảm bảo rằng các WKWebViewcấu trúc thư mục cũng hỗ trợ:

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

Điều này có nghĩa là nếu sample.htmltệp của bạn chứa <img src="subfolder/myimage.jpg">thẻ, thì tệp hình ảnh myimage.jpgtrongsubfolder cũng sẽ được tải và hiển thị.

Tín dụng: https://stackoverflow.com/a/8436281/4769344

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.