显示从Drupal站点获取并在本地存储在iPhone上的内容时出现问题

时间:2011-05-12 19:20:03

标签: iphone drupal uiwebview

我正在与Drupal开发人员合作开发一个iPhone应用程序,该应用程序从Drupal站点获取部分内容,将其存储在文件系统中,并在UIWebView中本地显示。我们遇到了一些问题,我们正在寻找一个解决方案,无论是在Drupal还是在iPhone端。

设置

  • 随着Drupal内容的更改,它将创建iPhone可以下载的已更改内容的清单。清单只列出了要下载的新内容的相关链接。
  • 下载后,应用会将内容本地存储在网页中。
  • iPhone将内容加载到UIWebView中;链接在所有不同页面之间导航。

问题

  • Drupals相对链接是相对于网站的根目录 - 即它们包含前导'/'。显然,当我加载页面时,相对于文件系统根目录的链接将无法工作,因为内容位于应用程序的文档目录中。我可以在文档目录前添加-webView:shouldStartLoadWithRequest:navigationType:链接用户点击,检查NSURLRequest是否包含从文档目录开始的URL,如果不包含则重定向。但是,这对页面资源没有帮助 - 例如CSS文件和图像。
  • Drupal不会将文件扩展名附加到路径,这会产生类似的困境。 UIWebView的-loadRequest方法似乎只有在它包含一个带有文件扩展名的文件的URL的NSURLRequest时才能工作。否则,我收到一个WebKitErrorDomain错误代码102:“帧加载中断”。有可能使用UIWebView的-loadHTMLString:baseURL:计算解决方案,但是当用户点击链接时,该方法对代码非常不友好(我现在还不确定为什么)。

忽略-release条消息,我用来加载网页的代码是:

NSString *fileToLoad = [appDelegate.webContentDirectory stringByAppendingPathComponent:filename];
NSURL *url = [[NSURL alloc] initFileURLWithPath:fileToLoad isDirectory:NO];
NSURLRequest *newURLRequest = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:(NSTimeInterval)5];

[self.webView loadRequest:newURLRequest];

我对创造性思维持开放态度 - 例如有没有我可以在应用程序中设置的iPhone网络服务器,它会自动解决这两个问题?

3 个答案:

答案 0 :(得分:0)

解决CSS /图像问题:当您从清单中下载文件时,可以将文件内容读入NSString,将文档目录路径附加到css /图像文件的路径,然后只保存该字符串覆盖“旧”文件。

答案 1 :(得分:0)

很抱歉,如果我不完全明白你想做什么。但根据我的理解,您在本地缓存节点页面的HTML源,保留服务器端的所有资源(图像,CSS,JavaScript等)。

为什么不使用UIWebView的方法:

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

http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/Reference/Reference.html#//apple_ref/occ/instm/UIWebView/loadHTMLString:baseURL

参数是:

  • 字符串:您本地缓存的HTML 源
  • baseURL :完整域名NSURL 网站

然后,UIWebView应无缝地加载任何资源。

答案 2 :(得分:0)

NSURLProtocol的子类化正是我们正在寻找的答案。在向系统注册我们的子类并将其配置为有选择地处理html请求(有效地覆盖我们认为合适的默认html协议处理程序)之后,我能够为每个请求加载我想要的任何内容。本质上,我将http请求重定向到缓存内容中的加载文件。

对于任何感兴趣的人,答案来自这个非常有趣的问题:Allow UIWebView to load http://localhost:port/path URIs without an Internet connection