【问题标题】:Remap UIWebView root URL to [[NSBundle mainBundle] bundleURL]将 UIWebView 根 URL 重新映射到 [[NSBundle mainBundle] bundleURL]
【发布时间】:2010-11-03 22:24:12
【问题描述】:

我的 iPhone 应用中有一些 HTML 和一些图片,排列如下:

html/
    foo.html
images/
    bar.png

我可以通过几种不同的方式让bar.png 出现在我的UIWebView 中——或者从NSUrl 加载foo.html,然后从html 目录返回目录树:

<img src="../images/bar.png"/>

或通过将foo.html 加载到字符串中,使用loadHtmlString,并使用[[NSBundle mainBundle] bundleURL] 作为baseURL

<img src="images/bar.png"/>

不过,这两种情况都有些笨拙——在第一种情况下,如果我移动 HTML 文件,我必须重新调整所有相对路径,而在第二种情况下,我必须忽略HTML 文件。

我想做的是这个——

<img src="/images/bar.png"/>

-- 将bundleURL 视为“站点”的根。有什么办法可以完成这项工作,还是我注定要翻译成file:///images/bar.png并且找不到文件?

【问题讨论】:

  • 我想做同样的事情。你有没有找到解决这个问题的方法?
  • 我会问,因为那是几年后的事了:你有没有找到一种在 iOS 文件系统中使用相对于根目录的 URL 的好方法?除了运行本地网络服务器之外,我还没有找到一种健全的方法来做到这一点——我什至很乐意通过重写 UIWebView 的请求来破解这些东西,只要有这样做的地方。
  • 很遗憾,没有,但我已经有几年没有做 IOS 开发了。
  • @DavePeck 我想我看到了一种实现这一点的方法,而无需像自定义 Web 服务器这样的黑客攻击 :)。需要使用 NSURLProtocol 实现自定义架构或重定向,一旦我有好的解决方案,我会发布答案。

标签: iphone uiwebview nsbundle


【解决方案1】:

我认为您要做到这一点的唯一方法是在您的应用程序中嵌入 Web 服务器。 Matt Gallagher 有一篇关于此的博文,您可以从这里开始。或者,可以将 CocoaHTTPServerMongoose 放入您的项目中。

【讨论】:

    【解决方案2】:

    如果我没记错的话,您的项目包中有一些文件要加载到 Web 视图中。只需以下几行代码即可完成:

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"bar" ofType:@"png"];
    NSURL    *imageURL  = [NSURL fileURLWithPath:imagePath];
    

    我假设您有一个包含 Web 视图模式的 text/html 文件。您需要将图像作为对象添加到那里 (src="%@"...),然后将 imageURL 添加到模式中:

    NSString *path = [[NSString alloc]initWithString:[[NSBundle mainBundle]pathForResource:@"htmlPattern" ofType:@"html"]];
    NSError *error;
    NSString *pattern = [[NSString alloc]initWithContentsOfFile:path 
                                                       encoding:NSUTF8StringEncoding
                                                          error:&error];
    
    
    htmlPage = [[NSString  alloc]initWithFormat:pattern,
                imageURL; 
    webView = [[UIWebView alloc] initWithFrame:WEBVIEW_FRAME];
    [webView loadHTMLString:htmlPage baseURL:[NSURL URLWithString:path]];
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:pattern]]];
    

    【讨论】:

    • 不再在这个项目上,但这看起来像是一种可行的技巧。谢谢!
    • 我不认为这解决了最初的问题,即寻求一种使用根相对 URL 的方法。如果您来自文件系统,根相对定义将成为文件系统的根...您想要以某种方式重写 URL,以便根位于 您的位置我>喜欢它......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多