iPhone Dev:UIWebView baseUrl到Documents文件夹中的资源不是应用程序包

问题描述:

问候!任何人都可以请您帮助我发现围绕以下几个办法:从文件夹iPhone Dev:UIWebView baseUrl到Documents文件夹中的资源不是应用程序包

  • 负载的HTML成的UIWebView使用loadHTMLString,包括(使用基本URL)的资源,如CSS,图像文件在用户的文档目录中 - 和不是来自应用程序的MainBundle

我见过关于如何使用baseURL加载应用程序捆绑包/ MainBundle的教程,该应用程序捆绑包/ MainBundle非常简单,但没有来自iPhone的Documents目录的资源。

我的文档文件夹的结构如下:

dirX 
|---> file.xml 
|---> dirCSS 
     |---> style.css 

我可以检索的完整路径的目录X(用户/......./ DIR X)。然而,通过这条道路的时候到一个UIWebView的基本URL,从而

[webView loadHTMLString:fileXMLString baseURL:pathToDirX] 

... webView的不承认的资源(例如在dirCSS style.css文件)作为fileXMLString

<link href="dirCSS/style.css" rel="stylesheet" /> 

内href'ed所以目前我的应用程序可以成功加载html字符串,但不加载样式表,因为链接到html字符串内的CSS是相对 - 例如。 CSS/style.css中

任何帮助是非常赞赏:)

经过一番谷歌搜索后,我终于找到了一个适合我提出的问题的解决方案。希望这可以帮助那些面临同样问题的人。

诀窍是在为UIWebView的baseURL创建NSURL对象时为字符串路径设置格式。尽管通常我在大多数情况下使用典型的“Users /...../ dir/file”,但使用UIWebView的loadHTMLString:baseURL进行加载需要不同的方法。

http://dblog.com.au/iphone-development/loading-local-files-into-uiwebview/,在那里我得到了解决描述,路径字符串的资源只是需要有斜杠被替换为双斜杠和空格%20:

NSString *imagePath = [[NSBundle mainBundle] resourcePath]; 
imagePath = [imagePath stringByReplacingOccurrencesOfString:@"/" withString:@"//"]; 
imagePath = [imagePath stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 

NSString *HTMLData = @" 
<h1>Hello this is a test</h1> 
<img src="sample.jpg" alt="" width="100" height="100" />"; 
[webView loadHTMLString:HTMLData baseURL: 
      [NSURL URLWithString: 
      [NSString stringWithFormat:@"file:/%@//",imagePath] 
      ]]; 

待办事项注意的替换字符串,并且还的:

[NSString stringWithFormat:@"file:/%@//",imagePath] 

尽管示例代码上面检索的路径的应用的mainBundle,它也可以在其他文件夹中的工作,即,文档(和其子文件夹)和我一样在矿。

亲切的问候, oonoo

PS再次感谢尼克的答复:)

+1

您可以使用NSString的stringByAddingPercentEscapesUsingEncoding:方法添加转义百分比。 – ddnv 2011-02-03 16:53:17

+0

这篇文章对我非常有帮助。这次真是万分感谢! ;-) – andi1984 2012-01-26 11:25:51

+0

这是从应用程序包加载,而不是从Documents目录加载。您链接的页面也在讨论从包中加载。 – 2012-06-26 23:40:21

要获得路径文件目录:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask ,YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"index.xml"]; 
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]] 

拥有一切工作的最简单的方法,是简单地加载从文档目录中的index.html而不是加载一个字符串。否则,将baseUrl设置为文档目录。

+0

感谢尼古拉的及时答复!我已经尝试过使用该文档目录路径,但UIWebView的baseURL似乎并没有正确使用,并且不会从文档目录加载CSS /图像。 其实我有两件事 – oonoo 2009-12-18 03:44:07

+0

是的,事实上我没有问题直接用loadRequest加载html,因为它很容易放置图像和CSS很好,但它的速度有问题。由于我从iPhone文档文件夹中加载loadHTMLString似乎是理想的,实际上很容易加载html字符串,除了..是的,无法获得加载的CSS和图像。 – oonoo 2009-12-18 04:09:19

+0

我编辑了我的答案,尝试loadRequest。 – 2009-12-18 04:36:24

// call this method and set the directory , Currently it is cache directory . If you want document directory then change NSCacheDirectory to NSDocumentDirectory 

-(NSString*)getBasePath 
{ 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
                NSUserDomainMask, YES); 
NSMutableString *cacheDirectory = [NSMutableString stringWithString:[paths objectAtIndex:0]]; 

[cacheDirectory appendString:@"/"]; 
NSRange renge= NSMakeRange(0, cacheDirectory.length); 
[cacheDirectory replaceOccurrencesOfString:@"/" withString:@"//" options:NSCaseInsensitiveSearch range:renge]; 
renge= NSMakeRange(0, cacheDirectory.length); 
[cacheDirectory replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:renge]; 
[cacheDirectory insertString:@"file://" atIndex:0]; 
//file:////Users//hb//Library//Application%20Support//iPhone%20Simulator//6.0//Applications//3A141D33-390A-4DD2-8825-7DDC07D29894//Library//Caches// 
return cacheDirectory; 

}