HTML资源在调试模式下正确加载,而不是在发布模式下

时间:2012-07-02 17:47:22

标签: html objective-c macos cocoa webview

目前我正在为我的用户界面的一部分使用HTML文件。我通过 WebView 显示这些文件。这在Xcode的调试模式中按预期工作。不幸的是,在归档应用程序后,HTML资源不再显示。

这很奇怪有很多原因:我可以看到文件肯定在应用程序中的正确资源文件夹中,WebView不会消失或隐藏,它只是显示一个白色背景,好像它没有加载任何东西。 / p>

对于我项目中的所有 HTML文件,这种观察结果是正确的。即使我不将它们用于UI,但为了在可共享的HTML文件中导出某些数据,它也不起作用(在发布模式下)。

我对这个问题进行了研究,但没有发现任何有趣的事情。我现在已经没想完了......

2 个答案:

答案 0 :(得分:1)

哇。那很有意思。我有一个解决方案,但不知道为什么它的工作方式。只有在有人遇到相同问题的情况下:虽然我没有使用

对HTML路径进行硬编码
[[inspectorView mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"inspectorView" ofType:@"html" inDirectory:@"HTML/inspectorView"]]]];

例如,在inspectorView是 WebView 的情况下,当应用程序名称包含空间时,它不起作用。无意中,我发现“MyAppsName.app”有效,而“MyAppsName 2.2.app”甚至“MyAppsName x.app”无效。

我已经听到有人抱怨版本信息不应该进入应用程序的标题内。确实如此。它仅用于在之后的测试过程中识别某些构建状态。

答案 1 :(得分:1)

由于您没有在问题中提供代码,因此很难对其进行调试......但是根据您自己的回答,我很确定我知道这个问题。您将路径字符串和URL字符串视为可互换,但它们不是。

你建议:

[[inspectorView mainFrame] 
  loadRequest:[NSURLRequest 
        requestWithURL:[NSURL 
                URLWithString:
                   [[NSBundle mainBundle]
                 pathForResource:@"inspectorView" 
                      ofType:@"html"
                     inDirectory:@"HTML/inspectorView"]]]];

(我添加了一些换行符以使其可读。)

要调用+ [NSURL URLWithString:],您需要一个表示URL的字符串,而不是表示路径的字符串。但是 - [NSBundle pathForResource:ofType:inDirectory:]返回一个路径。有一个函数可以从路径构造一个URL,+ [NSURL fileURLWithPath:isDirectory:],如果这是你想要的。

但是,除非您需要支持10.5及更早版本,否则通过使用 - [NSBundle URLForResource:withExtension:subdirectory:]而不是 - [[NSBundle URLForResource:withExtension:subdirectory:],首先获取URL并且不用来回转换就更容易了。 NSBundle pathForResource:ofType:inDirectory:]。

所以:

[[inspectorView mainFrame] 
  loadRequest:[NSURLRequest 
        requestWithURL:[[NSBundle mainBundle]
                 URLForResource:@"inspectorView" 
                  withExtension:@"html"
                   subdirectory:@"HTML/inspectorView"]]];

如果您想知道为什么您的代码在某些情况下工作而不是其他情况,请考虑一下“/Applications/MyApp.app/Contents/”(我将不再使用“Resources / HTML / inspectorView / inspectorView.html” “为简洁起见,因为这里不相关”意味着读取为URL。这是一个相对的URL;为了解释它,你取当前的基础,敲掉路径部分,并用字符串替换它。 + [NSURL URLWithString:]碰巧使用“file:// localhost”作为基础,这意味着你最终得到:

file://localhost/Applications/MyApp.app/Contents/

这恰好是一个有效的网址,实际上是您想要的文件的有效网址。这没有记录可行,但它恰好。在这种情况下。但是,如果你在其中放置一个空间怎么办?然后你得到:

file://localhost/Applications/MyApp X.app/Contents/

这不是有效的网址;你想要的是这个:

file://localhost/Applications/MyApp%20X.app/Contents/

当然,如果你调用+ [fileURLWithPath:isDirectory:]而不是+ [URLWithString:],那就是你得到的。

(我在这里作弊。实际上,NSURL在内部分别跟踪相对URL和基础,并在您尝试访问URL时编写它们。但是您现在可以忽略它。)