Ссылка на ресурсы внутри WebView - iPhone

У меня есть веб-просмотр в приложении для iPhone, и у меня также есть некоторые html файлы внутри папки Resources. Когда мое приложение загружается, я загружаю страницу из своих ресурсов в свой веб-просмотр. Но мне нужно сделать ссылки внутри моего веб-представления, которые указывают на некоторые другие ресурсы (например, изображения или другие html файлы). Выполнение относительной ссылки не работает:

<a href="OtherPage.html">Doesn't work</a>

Ответ 1

При загрузке этих ресурсов вам необходимо установить базовый URL. Вы можете сделать это, используя метод:

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

... где baseURL будет URL-адресом файла вашей папки ресурсов.

Ответ 2

По-видимому, есть немного получения в соответствии с Заметки о выпуске iPhone SDK для iPhone OS 3.0:

Проблема: UIWebView не может загружать локальные ресурсы в приложения, созданные против 3.0.

При использовании [UIWebView loadHTMLString:baseURL:] HTML строка не должна ссылаться на локальную ресурсов с помощью схемы file://. Вместо этого перейдите в NULL или file://URL для baseURL: или включить ресурсов непосредственно в HTML с <style> и <script>.

Достаточно честный. Но прохождение в стандартном номере file:// URL для baseURL не совсем работает. Однако... получается, что если вы измените / на // и пробелы на %20, вы будете установлены! (Использование %20 имеет большой смысл, но часть с двойной косой поразила меня врасплох.)

Скажем, у вас уже есть NSString *markup. Здесь все, что вы делаете. (Я прочитал здесь код для удобства чтения. Возможно, вы захотите реорганизовать/настроить на вкус.)

 NSString *resourcePath = [[[[NSBundle mainBundle] resourcePath]
     stringByReplacingOccurrencesOfString:@"/" withString:@"//"]
     stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
 [webView loadHTMLString:markup baseURL:[NSURL URLWithString:
     [NSString stringWithFormat:@"file:/%@//", resourcePath]]];

Пока ваш CSS, JavaScript и изображения упоминаются только по имени файла, это должно сделать трюк в iPhone OS 3.0, где loadHTMLString:baseURL: будет затронуто!

Ответ 3

Я исправил это: я использовал это для BaseURL, как сказал Август:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];

Спасибо!

Ответ 4

Этот код вернет строку с URL-адресом файла с именем "OtherPage.html" в вашем каталоге ресурсов пакета.

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]

Ответ 5

Это сработало для меня. Мои файлы HTML были в подпапках (а не в группах) в моем проекте. Моя страница html называется page01, а подпапка - html:

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
NSString *pathToHtml = @"html";
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:pathToHtml isDirectory:YES];

NSString *html = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]    
                             pathForResource:@"page01" ofType:@"html"                                                               
                             inDirectory:@"html"] 
                         encoding:NSUTF8StringEncoding error:nil];
[webview loadHTMLString:html baseURL:baseURL];

Ответ 6

Сначала попробуйте загрузить OtherPage.html. Если вы не можете, то это не так, и вы пропустили часть добавления в проект. Если вы можете, то в ссылке может быть только опечатка, или baseURL может быть неправильным, как указано в августе. Когда я создал html файл с изображениями в нем, которые были в файле ресурсов, он отлично работал, используя

<img src="file.png">

Ответ 8

Возможно, он имеет какое-то отношение к baseurl: когда я загружаю ресурсы, я использую эту строку:

[webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

см. в конце, он говорит baseURL: "". Если я это сделаю, это не сработает (сбой), но я не знаю пути к моим ресурсам. Если кто-то делает.....?

Ответ 9

Для меня проблема заключалась в том, что файлы js не были включены в комплект. Обязательно проверьте это.

Ответ 10

ОК, здесь 3,5 года спустя:)... попробовал предложение Майкла Гейлорда точно, но он не работал в симах для 5.0, 5.1, 6.0, 6.1 - и в реальных устройствах, работающих на нем. Однако это разъяснение о том, где вложены ресурсы (Где идет сборка сборки?) помогло мне это сделать:

  • создайте папку Finder в проекте (как предлагает Майкл - и я также НЕ пробовал "группу" )
  • поместите свой html в эту папку с помощью Finder
  • в файле использования Xcode → добавить файлы в проект
  • Убедитесь, что проект распознает, что он должен быть в комплекте:

    1. Щелкните правой кнопкой мыши главную цель проекта в окне "Навигатор",
    2. убедитесь, что выбраны TARGETS, вкладка "Фазы построения",
    3. Нажмите треугольник "Ресурсы копирования", >
    4. И - здесь, что отличается от Майкла. Он должен уже показать ваш html файл и путь. (Возможно, XCoders улучшили файлы сложения AI:)

Итак, все, что мне нужно было сделать, это скопировать-вставить код Майкла над вербальной базой и изменить эту строку:

                     inDirectory:@"html"] 

в

                     inDirectory:nil]

и Шаазам! он работал:)