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



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

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

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

我对这个问题进行了研究,但没有找到任何感兴趣的东西。我现在的想法快用完了...

由于您没有在问题中给出代码,因此很难调试它...但从你自己的回答来看,我很确定我知道问题所在。您将路径字符串和 URL 字符串视为可互换,但事实并非如此。

你建议这个:

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

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

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

但是,除非你需要支持 10.5 及更早版本,否则首先获取一个 URL 并且不必费心来回转换要容易得多,方法是使用 -[NSBundle URLForResource:withExtension:subdirectory:] 而不是 -[NSBundle pathForResource:ofType:inDirectory:]。

所以:

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

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

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

这恰好是一个有效的URL,实际上是您想要的文件的有效URL。这没有记录在案,但它碰巧有效。在这种情况下。但是,如果你在其中放一个空间呢?然后你会得到:

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

这不是一个有效的URL;你想要的是这个:

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

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

(我在这里作弊了一点。实际上,NSURL 在内部分别跟踪相对 URL 和基,并在您尝试访问 URL 时组成它们。但你现在可以忽略它。

哇。这很有趣。我有一个解决方案,但不知道为什么它会这样工作。只有在有人遇到相同问题的情况下:尽管我没有硬编码HTML的路径

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

例如,如果检查器视图是 WebView,则当应用程序的名称包含空格时,它不起作用。偶然地,我发现"MyAppsName.app"有效,而"MyAppsName 2.2.app"甚至"MyAppsName x.app"不起作用。

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

最新更新