Ссылка на ресурсы внутри WebView - iPhone - PullRequest
18 голосов
/ 26 января 2009

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

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

Ответы [ 10 ]

26 голосов
/ 09 сентября 2009

Очевидно, что есть некоторая ошибка в Замечаниях по выпуску 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:!

14 голосов
/ 26 января 2009

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

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

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

7 голосов
/ 26 января 2009

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

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

Спасибо!

3 голосов
/ 26 января 2009

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

[[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"OtherPage" ofType:@"html"]] absoluteString]
2 голосов
/ 26 апреля 2009

Это сработало для меня. Мои 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];
1 голос
/ 26 января 2009

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

<img src="file.png">
0 голосов
/ 16 марта 2013

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

  1. создать папку Finder в проекте (как предлагает Майкл - и я также НЕ пробовал 'group')
  2. поместите ваш html в эту папку, используя Finder
  3. в Xcode использовать file -> добавить файлы в проект
  4. Убедитесь, что проект распознает, что он должен быть в комплекте:

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

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

                     inDirectory:@"html"] 

до:

                     inDirectory:nil]

и Shaazam ! это сработало:)

0 голосов
/ 19 декабря 2011

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

0 голосов
/ 26 января 2009

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

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

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

0 голосов
/ 26 января 2009

Посмотрите, как Phonegap это делает. Вот их учебник по локальным ресурсам на iPhone . Шаг 11 может быть тем, что вы пренебрегаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...