iPhone Dev: UIWebView baseUrl для ресурсов в папке «Документы», а не в комплекте приложений - PullRequest
19 голосов
/ 18 декабря 2009

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

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

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

Структура моей папки с документами следующая:

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

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

[webView loadHTMLString:fileXMLString baseURL:pathToDirX]

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

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

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

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

Ответы [ 3 ]

25 голосов
/ 18 декабря 2009

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

Хитрость заключается в форматировании пути строки при создании объекта NSURL для baseURL UIWebView. Хотя обычно я использую типичный «Users /...../ dir / file» в большинстве случаев, загрузка с использованием loadHTMLString: baseURL в UIWebView требует другого подхода.

Как описано в 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 приложения, он также может работать в других папках, т. Е. Documents (и его подпапках), как я делал в моей.

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

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

12 голосов
/ 18 декабря 2009

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

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

1 голос
/ 14 мая 2013
 // 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;

}

...