使用uiwebview中的本地html从相对路径加载资源


121

我有一个带有uiwebview的非常简单的iOS应用,它加载了一个非常简单的测试页面(test.html):

<html>
<body>
<img src="img/myimage.png" />
</body>
</html>

我将此test.html文件加载到我的Web视图中:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
[webView loadHTMLString:html baseURL:baseUrl];

如果我在没有相对路径的情况下引用该图像并将引用的图像放在XCode中的Targets-> Copy Bundle Resources下的根路径中,则此方法效果很好,但是我无法使其与html文件中所示的相对路径一起使用。必须有一种方法,我有很多图像,css,javascript文件要加载到Webview中,我不想不必将所有内容都放在根目录中,也不必更改网站中的所有引用应用程式。

Answers:


286

这是如何加载/使用带有相对引用的本地html。

  1. 将资源拖到您的xcode项目中(我从查找器窗口中拖了一个名为www的文件夹),您将获得两个选项“为任何添加的文件夹创建组”和“为任何添加的文件夹创建文件夹引用”。
  2. 选择“创建文件夹引用..”选项。
  3. 使用下面给出的代码。它应该像一种魅力。

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [webview loadRequest:[NSURLRequest requestWithURL:url]];

现在,您在html中的所有相对链接(例如img / .gif,js / .js)都应该得到解析。

迅捷3

    if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") {
        webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
    }

1
超级和最多投票!谁能解释为什么“创建文件夹引用与“为任何添加的文件夹创建组”相反?”
Sean

3
作为旁注,如果您尝试加载与图像相对的javascript文件,则还需要查看以下内容:stackoverflow.com/a/3629479/385619
Willster 2014年

2
如果目录深n个文件夹怎么办?可以@"www/app"为目录arg 传递一个字符串吗?
射线

1
如果我们从文档而不是捆绑软件中加载html怎么办?
chipbk10 2015年

默认情况下,@ Sean XCode存储所有添加到根文件夹中的文件,组仅用于使您的项目树看起来更好。文件夹引用实际上按原样复制内容,从而保留目录结构。如果您希望相对路径在设备上的工作方式与在办公室机器上的工作方式相同,那是非常必要的。
燃烧器

24

在Swift中:

 func pathForResource(  name: String?, 
                        ofType ext: String?, 
                        inDirectory subpath: String?) -> String?  {

  // **name:** Name of Hmtl
  // **ofType ext:** extension for type of file. In this case "html"
  // **inDirectory subpath:** the folder where are the file. 
  //    In this case the file is in root folder

    let path = NSBundle.mainBundle().pathForResource(             "dados",
                                                     ofType:      "html", 
                                                     inDirectory: "root")
    var requestURL = NSURL(string:path!)
    var request = NSURLRequest(URL:requestURL)

    webView.loadRequest(request)
}

感谢您的Swift代码。与接受的答案一起工作得很好
Bala Vishnu

欢迎!:。)@Bala Vishnu
Weles 2014年

效果很好,我不得不拆开包装requestURL
RRikesh

5

我把所有东西都塞进了一行(不好,我知道),并且没有麻烦:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                                                                                                         ofType:@"html"]
                                                             isDirectory:NO]]];         

1
在目标节点下图像的XCode项目中,您是否使用“相对于项目”或“相对于封闭组”?我之所以使用相对项目,是因为在“获取信息”对话框中,选择“相对项目”时显示的路径看起来正确。但是,当我选择相对于封闭组时,它似乎正确加载了图像。现在,我就去获取我的完整页面,以使其能够与javascript和css一起正常使用,谢谢!
Matt Palmerlee 2011年

啊! 这个uiwebview非常脆弱,我开始向我的测试页中慢慢添加更复杂的测试(即,使用css而不是img标签中的inline设置图像),但是它没有用,所以我恢复了原来的状态,不再工作了!也许我在uiwebview中处理某种缓存?
Matt Palmerlee 2011年

5

我只是这样做:

    UIWebView *webView = [[[UIWebView alloc] init] autorelease];

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

其中“ index.html”相对引用图像,CSS,javascript等。


2

快速答案2。

所述的UIWebView类参考建议不要使用webView.loadRequest(请求):

不要使用此方法加载本地HTML文件。而是使用loadHTMLString:baseURL:。

在此解决方案中,html被读入字符串。html的url用于计算路径,并将其作为基本url传递。

let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)

如果是这种情况,最好参考手册中的建议,并在该页面中插入摘录-目前似乎没有上下文。
本·考克斯

苹果的评论在loadRequest的“实例方法”页面上:
杰夫

0

我回去测试并重新测试了它,看来我可以使它正常工作的唯一方法(因为我在img文件夹中有一些文件,而在js / css中有一些文件,等等...)不是在html中使用相对于我的图片的相对路径,并将所有内容都引用到bundle文件夹中。多可惜 :(。

<img src="myimage.png" />

0

@sdbrain在Swift 3中的答案:

    let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!)
    webView.loadRequest(NSURLRequest.init(url: url) as URLRequest)

-1

在使用WKWebView的Swift 3.01中:

let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!)
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest)

这会针对3.01中的一些更细微的语法调整进行调整,并使目录结构保持在适当位置,以便您可以嵌入相关的HTML文件。


自3.x版本以来,NS前缀是否不用于关键基础类型?那对我有用,谢谢! let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "mapa_procesos")!) webView.loadRequest(URLRequest(url: localURL))
Eduardo Gomez
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.