18

我的 iPhone 应用程序中有一个 webview,我的 Resources 文件夹中也有一些 html 文件。当我的应用程序加载时,我将一个页面从我的资源加载到我的 web 视图中。但是,我需要在我的 webview 中创建指向其他资源(例如,图像或其他 html 文件)的链接。仅仅做一个相对链接是行不通的:

<a href="OtherPage.html">Doesn't work</a>
4

10 回答 10

26

显然,根据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:问题!

于 2009-09-08T21:02:21.643 回答
14

加载这些资源时,您需要设置基本 URL。您可以使用以下方法执行此操作:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

...其中 baseURL 将是您的资源文件夹的文件 URL。

于 2009-01-26T02:12:07.593 回答
7

我修复了它:我将它用于 BaseURL,就像 August 说的:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

谢谢!

于 2009-01-26T20:48:51.940 回答
3

此代码将返回一个字符串,其中包含您的包资源目录中名为“OtherPage.html”的文件的 URL。

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
于 2009-01-26T06:02:24.087 回答
2

这对我有用。我的 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];
于 2009-04-26T13:34:53.770 回答
1

尝试先加载 OtherPage.html。如果你不能,那么它就不存在,并且你错过了将它添加到项目中的某些部分。如果可以,那么可能只是链接中有错字,或者 baseURL 可能不正确,如 August 所述。当我创建一个包含资源文件中图像的 html 文件时,只需使用它就可以正常工作

<img src="file.png">
于 2009-01-26T03:08:17.650 回答
0

看看Phonegap是如何做到的。这是他们关于 iPhone 上本地资源的教程。第 11 步可能是您忽略的。

于 2009-01-26T02:13:46.950 回答
0

也许它确实与baseurl有关:当我加载资源时,我使用这一行:

[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

看到最后,它说baseURL:“”。如果我把它拿出来,它就不起作用(崩溃),但我不知道我的资源的路径。如果有人这样做......?

于 2009-01-26T03:16:12.270 回答
0

对我来说,问题是 js 文件不包含在包中。一定要检查一下。

于 2011-12-19T15:10:03.807 回答
0

好的,3.5 年后在这里 :) ... 完全尝试了 Michael Gaylord 的上述建议,但它不适用于 5.0、5.1、6.0、6.1 的模拟人生 - 也不适用于运行相同的真实设备。然而,这个关于资源捆绑位置的 SO 澄清(构建输出在哪里?)帮助它像这样为我工作:

  1. 在项目中创建一个 Finder 文件夹(正如迈克尔建议的那样 - 我也没有尝试“组”)
  2. 使用 Finder 将您的 html 放入该文件夹
  3. 在 Xcode 中使用文件->将文件添加到项目中
  4. 确保项目通过以下方式识别它应该在捆绑包中:

    1. 右键单击导航器窗口中的主项目目标,
    2. 确保选择了 TARGETS,Build Phases选项卡,
    3. 单击复制捆绑资源三角形的东西 |>
    4. 而且 -这与迈克尔的不同 - 它应该已经显示了您的 html 文件和路径。(也许 XCoders 改进了添加文件 AI :)

所以我所要做的就是复制 - 将迈克尔的代码逐字粘贴并更改这一行:

                     inDirectory:@"html"] 

到:

                     inDirectory:nil]

沙赞!有效 :)

于 2013-03-15T23:17:45.950 回答