【问题标题】:HTML resource being loaded correctly in debug mode and not in release modeHTML 资源在调试模式下正确加载,而不是在发布模式下
【发布时间】:2012-07-03 03:47:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: html objective-c macos cocoa webview


    【解决方案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 时组合它们。但您现在可以忽略它。)

    【讨论】:

    • 这很有趣。感谢您的详细解释。它不仅有助于解决问题,而且有助于了解问题本身的内容。
    【解决方案2】:

    哇。那很有意思。我有一个解决方案,但不知道为什么会这样。仅以防万一有人遇到同样的问题:虽然我没有用

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

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

    【讨论】:

    • 这里的问题是你得到一个路径并在上面调用 +[URLWithString:] ,如果路径中有空格(或在许多其他情况下),这将不起作用。相反,请使用 +[fileURLWithPath:isDirectory:]。或者,更好的是,首先通过调用 -[URLForResource:withExtension:] 而不是 -[pathForResource:ofType:] 来获取 URL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多