如何加载本地 html 文件到 UIWebView

我试图加载一个 html 文件到我的 UIWebView,但它不会工作。下面是这个阶段: 在我的项目中有一个名为 html _ files 的文件夹。然后我在 Interface Builder 中创建了一个 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 是空白的,我希望你能帮帮我。

200165 次浏览

可能最好使用 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调用找到的。

通过这个你可以把你的项目资产(包)中的 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]]];

也许这对你有用。

我想你需要 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];
}

可能你的 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];

这里介绍了 HTML 文件与 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];

您可以使用请求调用 UIWebview 中的 HTML 文件

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

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

编辑2016-05-27 -ABc0暴露了“一个普遍存在的跨网站脚本漏洞”确保你拥有你加载的每一个资产。如果您加载了一个错误的脚本,它可以加载任何它想要的东西。

如果您需要相关链接才能在本地工作,请使用以下方法:

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

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

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

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

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

注:

确保检查了 html 文件的 目标成员,否则将引发以下异常:-

enter image description here

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

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

一种新的方法来做到这一点,使用迅捷。UIWebView 已不复存在,WKWebView 是加载网页的新类,它确保了 Web 视图的 Safari 特性。

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

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

斯威夫特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 _ {
}
}

对于 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)

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

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

注意 @"manual/index"手动操作是我的目录名! ! 对不起,我英语说得不好。

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

你好,哥斯达黎加。把这些文件(html 和其他资源)输入一个目录(我把它叫做手册) ,然后,关闭它们,输入 XCode,关于“支持文件”。用户必须选择“复制项目,如果需要”和“创建文件夹引用”。

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

请注意 @"manual/index"手动操作是我导演的名字! !

[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

这可能是晚了,但如果从 pathForResource的文件是 nil,你应该把它添加到 Build Phases > Copy Bundle Resources

enter image description here

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

假设您将 html_files文件夹拖动到 Xcode 并选择 创建文件夹引用选项,下面的 斯威夫特代码确保 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">标记,那么 subfolder中的图像文件 myimage.jpg也将被加载并显示。

来源: https://stackoverflow.com/a/8436281/4769344