【问题标题】:Link to resources inside WebView - iPhone链接到 WebView 中的资源 - iPhone
【发布时间】:2010-10-03 11:33:19
【问题描述】:

我的 iPhone 应用程序中有一个 webview,我的 Resources 文件夹中也有一些 html 文件。当我的应用程序加载时,我将一个页面从我的资源加载到我的 web 视图中。但是,我需要在我的 web 视图中创建指向其他资源(例如,图像或其他 html 文件)的链接。仅仅做一个相对链接是行不通的:

<a href="OtherPage.html">Doesn't work</a>

【问题讨论】:

  • 您介意给出一个完整的代码示例吗?仔细阅读此页面,我仍然对如何正确地将它们组合在一起感到有些困惑。谢谢。

标签: iphone html resources hyperlink webview


【解决方案1】:

当您加载这些资源时,您需要设置基本 URL。您可以使用以下方法执行此操作:

- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL

...baseURL 是资源文件夹的文件 URL。

【讨论】:

  • 谢谢 - 但我会接受我的答案而不是你的答案,因为它实际上解决了我的问题(在你的帮助下)。谢谢!
  • 在 3.0 中仍然可以做到。请参阅 jdandrea 的答案。
【解决方案2】:

看看Phonegap是如何做到的。 Here's their tutorial on local resources on the iPhone。第 11 步可能是您忽略的。

【讨论】:

  • 不,我检查了所有的步骤,我都做了。无论如何,谢谢。
【解决方案3】:

先尝试加载 OtherPage.html。如果你不能,那么它就不存在,并且你错过了将它添加到项目中的某些部分。如果可以,那么可能只是链接中有错字,或者 baseURL 可能不正确,如 August 所述。当我创建了一个包含资源文件中图像的 html 文件时,只需使用它就可以正常工作

<img src="file.png">

【讨论】:

    【解决方案4】:

    也许它确实与baseurl有关:当我加载资源时,我使用这一行:

    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    

    看到最后,它说baseURL:“”。如果我把它拿出来,它就不起作用(崩溃),但我不知道我的资源的路径。如果有人这样做......?

    【讨论】:

      【解决方案5】:

      此代码将返回一个字符串,其中包含您的包资源目录中名为“OtherPage.html”的文件的 URL。

      [[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
      

      【讨论】:

        【解决方案6】:

        我修复了它:我将它用于 BaseURL,就像 August 所说的:

        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSURL *baseURL = [NSURL fileURLWithPath:path];
        

        谢谢!

        【讨论】:

        • 似乎不适用于 iPhone OS 3.0。稍作修改,请参阅我的其他帖子!
        【解决方案7】:

        这对我有用。我的 HTML 文件位于项目的子文件夹(不是组)中。我的html页面叫做page01,子文件夹是html:

        NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
        NSString *pathToHtml = @"html";
        NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];
        
        NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]    
                                     pathForResource:@"page01" ofType:@"html"                                                               
                                     inDirectory:@"html"] 
                                 encoding:NSUTF8StringEncoding error:nil];
        [webview loadHTMLString:html baseURL:baseURL];
        

        【讨论】:

          【解决方案8】:

          根据iPhone SDK Release Notes for iPhone OS 3.0,显然有一点问题:

          问题: UIWebView 无法在针对 3.0 构建的应用中加载本地资源。

          使用[UIWebView loadHTMLString:baseURL:] 时,HTML 字符串不应引用本地 file:// 方案的资源。 相反,传入NULLfile:// baseURL: 的 URL,或包含 资源直接在 HTML 中 &lt;style&gt;&lt;script&gt; 标签。

          很公平。但是为baseURL 传递标准问题file:// URL 并不完全有效。但是...事实证明,如果您将/ 更改为// 并将空格更改为%20,您将被设置! (使用%20 很有意义,但双斜线部分让我感到意外。)

          假设您已经设置了NSString *markup。这就是你所做的一切。 (为了便于阅读,我将代码打包在这里。您可能希望重构/调整以适应口味。)

           NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
               stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
               stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
           [webView loadHTMLString:markup baseURL:[NSURL URLWithString:
               [NSString stringWithFormat:@"file:/%@//", resourcePath]]];
          

          只要您的 CSS、JavaScript 和图像仅由文件名引用,这应该可以在 iPhone OS 3.0 中解决loadHTMLString:baseURL: 的问题!

          【讨论】:

          • 非常感谢您的发帖...这应该是正确的答案
          • 你知道……现在我再次查看我写的内容,我想知道我是否使用“file:/%@//”而不是“file://%@ /" ?这可能是 / 到 // 要求的无意来源,在这种情况下,它只是处理空格的问题,这是标准问题 S/G/HTML 的东西。想法? (已经有一段时间了,所以如果我在这里忘记了自己的逻辑,请随时纠正我 - 哈!)
          • 刚才在 iOS 4.2 中遇到了同样的问题。未显示本地图像。然后我最终像这样格式化我的 URL(四斜杠!)它可以工作:“file:////Users//iDeveloper//Library//Application%20Support//iPhone%20Simulator//4.2//Applications// 9706B7FE-4FAC-4FB0-9DA4-C07F322D4AC1//TestBrowser.app//Data//HTML//English//”。使用“正确”的语法,在路径中使用一个斜杠,在“file://”中使用两个斜杠是行不通的。非常感谢!
          【解决方案9】:

          对我来说,问题是 js 文件未包含在包中。请务必检查。

          【讨论】:

            【解决方案10】:

            好的,3.5 年后在这里 :) ... 完全尝试了 Michael Gaylord 的上述建议,但它不适用于 5.0、5.1、6.0、6.1 的 sims - 也不适用于运行相同的真实设备。 但是这个关于资源捆绑位置的 SO 澄清 (Where is build output going?) 帮助它像这样为我工作:

            1. 在项目中创建一个 Finder 文件夹(正如 Michael 建议的那样 - 我也没有尝试“组”)
            2. 使用 Finder 将您的 html 放入该文件夹中
            3. 在 Xcode 中使用 file -> 将文件添加到项目中
            4. 确保项目通过以下方式识别它应该在捆绑包中:

              1. Navigator窗口中右键单击主项目目标,
              2. 确保选择了目标,构建阶段选项卡,
              3. 单击复制捆绑资源三角形的东西|>
              4. 而且 - 这与迈克尔的不同之处 - 它应该已经显示了您的 html 文件和路径。 (也许 XCoders 改进了添加文件 AI :)

            所以我所要做的就是将 Michael 的代码复制粘贴到 verbatum 上方并更改这一行:

                                 inDirectory:@"html"] 
            

            到:

                                 inDirectory:nil]
            

            Shaazam !成功了:)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-05
              • 2013-12-26
              • 1970-01-01
              • 2010-09-06
              • 2021-12-01
              • 1970-01-01
              相关资源
              最近更新 更多