如何在 WebView Cocoa / Mac OS 上加载带有图像、js 和 css 的本地 html 文件

Posted

技术标签:

【中文标题】如何在 WebView Cocoa / Mac OS 上加载带有图像、js 和 css 的本地 html 文件【英文标题】:How to load local html files with images, js and css on WebView Cocoa / Mac OS 【发布时间】:2011-07-26 16:02:19 【问题描述】:

我有代码可以在 ios 上完成这项工作。使用我在这里和网上找到的任何东西,我设法找到了制作 Cocoa Mac Os 版本的地方,但图像无法加载。 CSS 和 javascript 似乎也没有加载。 html 的目录被添加到 Resources 组,但它被添加为文件夹引用(蓝色文件夹),这使得 Xcode 尊重 HTML 应用程序的目录结构。

这是我尝试使用的代码:

NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" 
                                                     ofType:@"html" 
                                                inDirectory:@"/Patient_eMMR_HTML5" ];
NSString *html = [NSString stringWithContentsOfFile:htmlPath 
                                           encoding:NSUTF8StringEncoding 
                                              error:nil];

[[webView mainFrame] loadHTMLString:html baseURL:[NSURL fileURLWithPath:
                                                   [NSString stringWithFormat:@"%@/Patient_eMMR_HTML5/", 
                                                   [[NSBundle mainBundle] bundlePath]]]];

这是我基于上面使用的代码的 iOS 版本代码:

NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index" 
                                                     ofType:@"html" 
                                                inDirectory:@"/Patient_eMMR_HTML5" ];

NSString *html = [NSString stringWithContentsOfFile:htmlPath 
                                           encoding:NSUTF8StringEncoding 
                                              error:nil];

[webView loadHTMLString:html 
                baseURL:[NSURL fileURLWithPath:
                         [NSString stringWithFormat:@"%@/Patient_eMMR_HTML5/", 
                          [[NSBundle mainBundle] bundlePath]]]];

非常感谢任何帮助。谢谢。

【问题讨论】:

【参考方案1】:

如果您通过NSURLRequest 而不是作为字符串加载 HTML,则无需处理基本 URL:

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"index" 
                                                     ofType:@"html"
                                                inDirectory:@"Patient_eMMR_HTML5"];
NSURL* fileURL = [NSURL fileURLWithPath:filePath];
NSURLRequest* request = [NSURLRequest requestWithURL:fileURL];
[[webView mainFrame] loadRequest:request];

请注意,您应该只在‑pathForResource:… 方法中指定目录名称,不要使用正斜杠作为前缀。假定命名目录植根于主包的目录。

请注意,UIWebView 也有一个 ‑loadRequest: 方法,因此您可以在 iOS 上使用几乎相同的代码。

【讨论】:

非常感谢 Rob,它成功了。我仍然遇到 Canvas 不绘图的问题。我现在不打算使用这种方法,因为我们无法重新测试所有内容,所以现在我正在做一个打开 Safari 的愚蠢链接,但我确实想学习这一点。再次感谢。 就 Canvas 而言,您确定为 WebView 启用了 JavaScript 吗? 好吧,我没有启用或禁用任何东西。代码正是你在那里给我的。尽管如此,许多通过 Javascript 触发的东西仍然有效。只是 Canvas 似乎失败了。我什至有一些以编程方式创建并且正在运行的 CSS 动画。我会搜索这个。 fileURLWithPath: 正是我需要的 - URLWithString: 没有返回我想要的。【参考方案2】:

这对我在 Mac OSX 上的 resourceURL 有效

[webView loadHTMLString:htmlContent baseURL:[[NSBundle mainBundle] resourceURL]]

【讨论】:

正是我需要的,谢谢!它在 Swift 4 中:webView.mainFrame.loadHTMLString(html, baseURL: Bundle.main.resourceURL!)【参考方案3】:

mserin,这个问题是针对 Mac Os X 的 Cocoa 框架。您正在使用 UIWebView,它是 Cocoa Touch 的 UIKit 的一部分。如果你想为 iPhone / iPad 构建这个,你 should look at this post.

如果您尝试在 Mac 上执行此操作,请使用我们在此处使用的代码,但您需要包含这样的 WebKit 框架:

#import <WebKit/WebKit.h>

然后继承 WebView,而不是 UIWebView:

WebView *webView;

具有这样的属性:

@property (nonatomic, retain) IBOutlet WebView *webView;

【讨论】:

以上是关于如何在 WebView Cocoa / Mac OS 上加载带有图像、js 和 css 的本地 html 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cocoa MacOS Webview 中显示简单的文本消息(toasts/alerts)?

如何使用 Cocoa (Mac) 在 Swift 中创建 PDF

如何在cocoa中模拟mac媒体密钥

如何使用 Cocoa 和 CGDisplayCreateImageForRect 在 Mac OS X 中截取区域截图?

我如何在 Mac OS X 上判断我是不是安装了 Carbon 或 Cocoa 版本的 Qt?

Cocoa - 如何检测泛在容器中的变化