如何将本地HTML文件加载到UIWebView中


165

我正在尝试将html文件加载到我的UIWebView中,但是它将不起作用。这是阶段:在我的项目中有一个名为html_files的文件夹。然后,我在界面构建器中创建了一个webView,并在viewController中为其分配了出口。这是我用来附加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];
}

那是行不通的,UIWebView是空白的。我将不胜感激。

Answers:


272

可能最好使用NSString并按如下方式加载html文档:

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

迅速

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

Swift 3几乎没有变化:

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

你试过了吗?

还要检查是否通过pathForResource:ofType:inDirectory调用找到了资源。


那没有用,我做了NSLog(@“%@”,htmlFile); 只是检查,它说空。
madcoderz 2011年

因此,这意味着找不到资源。仅检查:NSString * htmlFile = [[NSBundle mainBundle] pathForResource:@“ sample” ofType:@“ html”]; 没有inDirectory
user478681 2011年

没有inDirectory,我得到了:iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html,但是html没出现在屏幕上,它仍然是空的。我想念其他东西吗?这是示例项目:http
madcoderz 2011年

3
您只需要修复
Webview的

3
这个答案有很多票,但似乎已经过时了。使用此方法无法加载本地图像和CSS资产。请参阅此答案
paulmelnikow 2014年

90

编辑2016年5月27日 - loadRequest自曝“一个普遍的跨站点脚本漏洞。” 确保拥有所有加载的资产。如果加载错误的脚本,它可以加载任何所需的内容。

如果您需要相对链接才能在本地工作,请使用以下命令:

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

捆绑软件将搜索项目的所有子目录以查找my.html。(目录结构在构建时变平)

如果my.html具有标签<img src="some.png">,则webView some.png将从您的项目中加载。


4
我无法在此页面上获得可接受的答案,但是这种方法是第一次成功。我认为,自原始答案以来,iOS一直在发展。谢谢。
詹姆斯,

感谢您的回答。此答案与接受的答案的不同之处在于HTML文档工作中的链接。
艾米

2
苹果公司表示,为帮助您避免遭受安全攻击,请确保使用loadHTMLString:baseURL:来加载本地HTML文件;否则,请执行以下步骤:不要使用loadRequest:。
ED-209

接受的答案对我不起作用。感谢@neal Ehardt这个答案对我有用。
米希尔·奥扎

这仅对我有用,如果html文件不在任何文件夹中
Renan Franca

40

这样,您可以将项目Assets(bundle)中的html文件加载到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]]];

可能对您有用。


相同,我要做的唯一区别是您以编程方式创建了webView。但还是要感谢
madcoderz 2011年

您通过NSLog获取该html文件的路径。
AJPatel

应检查html文件的目标成员身份,否则将引发以下异常:-由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'***-[NSURL initFileURLWithPath:isDirectory:]:零字符串参数'
Durai Amuthan。 H

9

我想您需要先allocate初始化webview

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

一个简单的复制粘贴代码段:

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

注意:

确保检查了html文件的目标成员身份,否则将抛出以下异常:

在此处输入图片说明

由于未捕获的异常而终止应用程序

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


6

对于Swift 3和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)

这不会加载链接文件,例如<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

可能是您的HTML文件不支持UTF-8编码,因为相同的代码对我有用。

或者您也可以使用以下代码行:

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

这就是用Jquery处理HTML文件的方式。

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

您可以使用任一请求在UIWebview中调用HTML文件


3

确保“ html_files”是应用程序主捆绑包中的目录,而不仅仅是Xcode中的组。


3

一种使用swift进行此操作的新方法。不再是UIWebView了,WKWebView是加载网页的新类,这确保了Safari在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"];

它可能会迟到,但如果从该文件pathForResourcenil你应该在添加它Build Phases > Copy Bundle Resources

在此处输入图片说明


2

这是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

在Swift 2.0中,@ user478681的答案可能如下所示:

    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)

最好使用let来测试路径/无文件中的错误:
ingconti 2015年

0

将所有文件(html和资源)放在目录中(对于我的“手册”)。接下来,将目录拖放到XCode的“ Supporting Files”上。您应该检查选项“如果需要,复制项目”和“创建文件夹引用”。接下来,编写一个简单的代码:

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

注意@"manual/index"手册是我目录的名称!!全部!!!对不起,我的英语不好...

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

Hola desde哥斯达黎加。Ponga los archivos(html ydemásrecursos)和Directorio(en mi caso lollamé手册),luego,arrastre y suelte en XCode和“支持文件”。使用过的debe seleccionar las opciones“如果需要,复制项目”和“创建文件夹引用”。

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

指导手册@"manual/index",指导手册!!


0

当您的项目变大时,您可能需要一些结构,以便您的HTML页面可以引用位于子文件夹中的文件。

假设您将html_files文件夹拖到Xcode并选择“ 创建文件夹引用”选项,则以下Swift代码可确保同时WKWebView支持所得到的文件夹结构:

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

这意味着,如果你的sample.html文件包含一个<img src="subfolder/myimage.jpg">标签,然后将图像文件myimage.jpgsubfolder也将被加载并显示。

学分:https//stackoverflow.com/a/8436281/4769344

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.