1

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

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

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

我对这个问题进行了研究,但没有发现任何感兴趣的东西。我现在的想法已经不多了...

4

2 回答 2

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”都不起作用。

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

于 2012-07-02T18:14:52.097 回答
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 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/

这恰好是一个有效的 URL,实际上是您想要的文件的有效 URL。这没有记录在案,但它发生了。在这种情况下。但是如果你在里面放一个空格呢?然后你得到:

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

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

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

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

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

于 2012-07-02T20:09:30.207 回答