IPhone Dev: UIWebView baseUrl для ресурсов в папке Documents not app bundle

Привет! Может кто-нибудь, пожалуйста, любезно помогите мне найти способ вокруг следующего:

  • загрузите html в UIWebView с помощью loadHTMLString и включите (используя baseURL) ресурсы, такие как CSS, файлы изображений из папок в папке "Документы пользователя", а не из MainBundle приложения.

Я ознакомился с учебными материалами о том, как использовать baseURL для загрузки в комплекте приложений /MainBundle, который прост, но не с ресурсами из каталогов документов iPhone.

Структура папки моих документов выглядит следующим образом:

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

Я могу получить полный путь к директории X (Users/......./dir X). Однако при передаче этого пути в базу UIWebViewURL, чтобы

[webView loadHTMLString:fileXMLString baseURL:pathToDirX]

... webView не распознает ресурсы (например, style.css в dirCSS), поскольку href'ed в файлеXMLString

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

Итак, в настоящее время мое приложение может успешно загрузить строку html, но не загружает таблицу стилей, поскольку ссылка на CSS внутри строки html относительна - например. CSS/style.css

Любая помощь очень ценится:)

Ответ 1

После некоторого поиска я наконец нашел подходящее решение для поставленного вопроса. Надеюсь, это поможет тем, кто сталкивается с той же проблемой.

Трюк заключается в форматировании строкового пути при создании объекта NSURL для baseURL UIWebView. Хотя обычно я использую типичный "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]

Хотя приведенный выше примерный код возвращает путь к основному блоку приложения, он также может работать в других папках, то есть в документах (и вложенных папках), как и в моем.

С уважением, oonoo

PS Еще раз спасибо Nic за ответ:)

Ответ 2

Чтобы получить путь к каталогу документа:

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 в каталог документа.

Ответ 3

 // 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;

}