UIWebView - 加载带链接资源的本地 .html 文件

4

我不知道我已经阅读了多少个论坛,但我真的不知道为什么它不起作用!

我有一个iPhone应用程序,我想向用户展示一本Epub书。

用户可以在线阅读,否则他可以下载到应用程序文档目录中以后阅读。

我建立了与在线版本相同的文件夹结构,并将其保存到文档文件夹“frontend”中。

我也可以阅读此维护的.HTML文件,但链接的JS / CSS和HTML文件无法正常工作。

所以我有一些屏幕截图。我不知道为什么JavaScript无法访问.html文档。

离线版本-保存在文件系统“文档文件夹”中

在线版本-直接从服务器获取-没问题!

我希望你能给我一些提示。


如果您正在开发本地应用程序,可以使用此处描述的“桥接”http://stackoverflow.com/a/9640486/792677(拦截webView加载请求并在webView之外处理它们)。 - A-Live
我使用[webView loadRequest...]来展示我的文档中的.html文件。这个.html文件还有相对路径到css/JS和其他html文档的引用链接。但是它没有起作用... - iach
你的意思是说JS和CSS根本没有起作用吗?那么你可能会发现同一个问题的第二个答案中的链接很有用:https://dev59.com/YG025IYBdhLWcg3w6KOO - A-Live
我认为问题在于我的HTML结构不在NSBundle中。如果用户需要,我会动态生成它。它将存储在文档目录中,因此这种方法行不通。 - iach
我在应用程序文档文件夹中有这个文件夹结构:Application->Document->mlib->script->xxx.js。如果我的index.html已经加载到Web视图中,是否可以从index.html相对地加载.js文件? - iach
嗨,我改变了我的代码。就像你说的那样,我将我的index.html和javascript文件存储到了mainBundle中。像这样:NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"offlineEpub" ofType:@"html" inDirectory:@"WWW"]]; [webViewEpub loadRequest:[NSURLRequest requestWithURL:url]]; 我能否从这个index.html链接到文档目录中的其他.html文件资源? - iach
2个回答

4

经过大量的尝试和阅读很多答案,这是我的简单综合解决方案:

1) 确保所有捆绑资源都是唯一的——目录被展平

这真的很令人沮丧,但如果你有“关于/index.html”和“主页/index.html”这样的目录,最后复制到捆绑包中的一个“index.html”将覆盖之前的文件。

2) JavaScript文件会在错误的构建阶段中

在Xcode中,点击你的项目,然后点击你的应用程序目标,然后点击Build Phases。注意JavaScript文件将错误地位于Compiled Sources中:将JS文件移动到Copy Bundle Resources中。

3) 使用UIWebView的loadRequest:

不要从字符串加载。使用NSURL代替。

NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *url = [mainBundle URLForResource:@"some_page" withExtension:@"html"];
NSURLRequest *urlReq = [NSURLRequest requestWithURL:url];

// Assuming you create an IBOutlet defined like:
// @property (strong, nonatomic) IBOutlet UIWebView *wv;
[self.wv loadRequest:urlReq];

4

只需编写代码

NSString *path = [[NSBundle mainBundle] pathForResource:@"offlineEpub" ofType:@"html"];
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
UIWebView *webView = [[UIWebView alloc] init];
[webView loadHTMLString:content baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
[self.view addSubview:webView];

关键是将基本URL提供为您的mainBundle或documents目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接