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