我的 iPhone 应用程序中有一个 webview,我的 Resources 文件夹中也有一些 html 文件。当我的应用程序加载时,我将一个页面从我的资源加载到我的 web 视图中。但是,我需要在我的 webview 中创建指向其他资源(例如,图像或其他 html 文件)的链接。仅仅做一个相对链接是行不通的:
<a href="OtherPage.html">Doesn't work</a>
显然,根据iPhone SDK Release Notes for iPhone OS 3.0有一些问题:
问题: UIWebView 无法在针对 3.0 构建的应用中加载本地资源。
使用
[UIWebView loadHTMLString:baseURL:]
时,HTML 字符串不应使用该file://
方案引用本地资源。取而代之的是,传入NULL
或 的file://
URL ,或使用和标记baseURL:
直接在 HTML 中包含资源 。<style>
<script>
很公平。但是传递一个标准问题的file://
URLbaseURL
并不完全有效。但是...事实证明,如果您/
将//
和空格更改为%20
,您将被设置!(使用%20
很有意义,但双斜线部分让我感到惊讶。)
假设您已经NSString *markup
设置好了。这就是你所做的一切。(为了便于阅读,我将代码打包在这里。您可能希望重构/调整以适应口味。)
NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
[webView loadHTMLString:markup baseURL:[NSURL URLWithString:
[NSString stringWithFormat:@"file:/%@//", resourcePath]]];
只要您的 CSS、JavaScript 和图像仅由文件名引用,这在 iPhone OS 3.0 中应该可以解决loadHTMLString:baseURL:
问题!
加载这些资源时,您需要设置基本 URL。您可以使用以下方法执行此操作:
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL
...其中 baseURL 将是您的资源文件夹的文件 URL。
我修复了它:我将它用于 BaseURL,就像 August 说的:
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
谢谢!
此代码将返回一个字符串,其中包含您的包资源目录中名为“OtherPage.html”的文件的 URL。
[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
这对我有用。我的 HTML 文件位于项目的子文件夹(不是组)中。我的html页面称为page01,子文件夹是html:
NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathToHtml = @"html";
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];
NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]
pathForResource:@"page01" ofType:@"html"
inDirectory:@"html"]
encoding:NSUTF8StringEncoding error:nil];
[webview loadHTMLString:html baseURL:baseURL];
尝试先加载 OtherPage.html。如果你不能,那么它就不存在,并且你错过了将它添加到项目中的某些部分。如果可以,那么可能只是链接中有错字,或者 baseURL 可能不正确,如 August 所述。当我创建一个包含资源文件中图像的 html 文件时,只需使用它就可以正常工作
<img src="file.png">
看看Phonegap是如何做到的。这是他们关于 iPhone 上本地资源的教程。第 11 步可能是您忽略的。
也许它确实与baseurl有关:当我加载资源时,我使用这一行:
[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
看到最后,它说baseURL:“”。如果我把它拿出来,它就不起作用(崩溃),但我不知道我的资源的路径。如果有人这样做......?
对我来说,问题是 js 文件不包含在包中。一定要检查一下。
好的,3.5 年后在这里 :) ... 完全尝试了 Michael Gaylord 的上述建议,但它不适用于 5.0、5.1、6.0、6.1 的模拟人生 - 也不适用于运行相同的真实设备。然而,这个关于资源捆绑位置的 SO 澄清(构建输出在哪里?)帮助它像这样为我工作:
确保项目通过以下方式识别它应该在捆绑包中:
所以我所要做的就是复制 - 将迈克尔的代码逐字粘贴并更改这一行:
inDirectory:@"html"]
到:
inDirectory:nil]
和沙赞!有效 :)