UIWebView loadHTMLString не работает в iOS5 - PullRequest
14 голосов
/ 20 октября 2011

Возможно, это похоже на вопрос, на который нет ответов: loadHTMLString не работает с iOS5?

У меня есть UIWebView, который я заполняю с помощью loadHTMLString: baseURL :.HTML-код маленький и простой, и он ссылается на таблицу стилей CSS и скрипт javascript, которые загружаются через baseURL :, который устанавливается в каталог внутри пакета приложения.

    // load the html
    NSString* filePath = [NSString stringWithFormat: @"%@/html", [[NSBundle mainBundle] resourcePath ] ];
    [_pCurrentWebView loadHTMLString: html baseURL: [NSURL fileURLWithPath: filePath isDirectory: YES ] ];

Это всегдаработал в прошлом, но он сломался в iOS5.В iOS5 ничего не отображается в UIWebView.В веб-представлении содержатся исходные данные всех ожидаемых событий - например, shouldLoadRequest, didStartLoad, didFinishLoad и т. Д.

HTML-код содержит тег сценария, например:

<script type="text/javascript" src="./myscript.js" />

Если удалить тег сценариязатем страница загружается и хорошо отображается в iOS5.И я могу сказать, что файл css, на который ссылаются так же, как файл сценария .js, загружается и применяется.

Если я сохраню тег script, но сделаю файл myscript.js полностью пустым, он по-прежнемуне удается загрузить.

Мне кажется, это своего рода проблема межсайтового скриптинга - в том, что WebView считает, что он должен запретить загрузку скрипта (и фактически запретить рендеринг страницы ??)

Не уверен, куда идти отсюда.Идеи?

ОБНОВЛЕНИЕ

Это все больше и больше похоже на проблему межсайтового скриптинга.Если я удаляю тег, он работает, хотя и без сценария.Все мои изображения загружаются из baseURL, как и моя таблица стилей.То есть мы знаем, что baseURL работает.

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

Все еще ищем подтверждения и дополнительных идей для обхода.Мне неудобно вставлять сам скрипт в html, но пока это мое лучшее решение.В качестве альтернативы я мог бы написать html в файловую систему и загрузить через loadRequest, но опять же, не мой первый выбор.

ОБНОВЛЕНИЕ 2

Благодаря @djromero у меня есть решение,Мой документ является документом XHTML и поэтому использует самозакрывающийся тег сценария (без содержимого, только атрибуты). Но loadHTMLString:baseURL:, по-видимому, принимает MIMEType text/html, который UIWebView, по-видимому, теперь интерпретирует более строго - и в text/html документы, которые могут не иметь самозакрывающихся тегов.

Мое решение состоит в том, чтобы переключиться на loadData:MIMEtype:baseURL: и указать application/xhtml+xml в качестве типа пантомимы.Я могу легко построить NSData из моей строки NSString, используя dataUsingEncoding:.

Ответы [ 2 ]

11 голосов
/ 31 октября 2011

Я не эксперт по стандартам HTML, но ... вы пытались закрыть тег <script>:


<script type="text/javascript" src="./myscript.js"><b></script></b>

Это сработало для меня.

1 голос
/ 20 октября 2011

Способ загрузки файла HTML, который содержит ссылки на встроенные папки, например, /file.js, состоит в том, чтобы загрузить его как URL, а не как STRING.

NSString *urlAddress = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"htm"];
NSURL *url = [NSURL fileURLWithPath:urlAddress];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];

Я использую этовместе со ссылочными папками (не ссылочными файлами) для создания обычной структуры веб-сайта в Xcode с js / и css / и изображениями / ссылками во встроенном файле index.htm, например

<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script>

UPDATE

Я не думаю, что ссылка на URI в загруженной строке HTML была официально поддержана.Если вам необходимо использовать строку, загрузите в нее необходимые файлы ресурсов, прежде чем загружать ее в UIWebView.

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