Можете ли вы перехватывать NSURLRequests в UIWebView, не нажимая кнопку «Назад»? - PullRequest
13 голосов
/ 24 января 2011

У меня проблемы с загрузкой пользовательского HTML в мой UIWebView, не нарушая его goBack метод.

Что работает

Я перехватываю запросы URL моего UIWebView, чтобы я мог загрузить собственный HTML. У меня есть контроль над всем HTML, поэтому в моих специальных запросах приложений используется настраиваемая схема (т. Е. myapp://arg1/?arg2=val), которую я могу проанализировать в webView:shouldStartLoadWithRequest:navigationType:. Я решаю, какой HTML-код я действительно хочу загрузить, и вызываю loadHTMLString:baseURL и возвращаю NO, чтобы отменить исходный запрос.

Что не работает

Вышеописанное прекрасно работает. Проблема в том, что я хочу использовать метод UIWebView's goBack, а loadRequest:, похоже, единственный метод UIWebView, который добавляет в свой стек истории.

У меня есть несколько идей, но я не уверен, какие из них осуществимы и как их реализовать. Кажется, главное, что я должен вернуть YES в webView:shouldStartLoadWithRequest:navigationType и использовать метод UIWebView loadRequest.

Идея 1: Изменить NSURLRequest / Response: Могу ли я создать подкласс NSURLRequest, чтобы (когда UIWebView делал запрос) он фактически не делал HTTP-запрос и возвращал NSURLResponse с моим HTML в нем? Или, может быть, каким-то образом изменить / создать подкласс / добавить метод категории к NSURLResponse? Мне нравится идея, что это реальный запрос, но я обеспокоен частными API-интерфейсами и их отклонением из App Store.

Идея 2. Обработка пользовательского протокола URL Зарегистрируйте собственный протокол URL, чтобы мое приложение отвечало на него, и я мог заставить его вернуть законный NSURLResponse (заполненный моим собственным HTML.)

Идея 3: обмануть кеш Создать запрос с помощью этой политики кеша NSURLRequestReturnCacheDataDontLoad, а затем каким-то образом получить мой HTML между webView и кешем?

А может, я совсем не на том пути?

Ответы [ 3 ]

7 голосов
/ 11 июля 2012

Существует еще один действительно умный подход, который я только что опробовал: вместо того, чтобы возиться с NSURLCache или переписать весь код истории навигации, просто создайте пользовательский NSURLProtocol, который используется стандартом NSURLConnection всякий раз, когда HTTP запрос сделан. Там вы создаете свой собственный NSURLRequest для загрузки данных и можете проверять тип MIME, изменять содержимое запроса или кэшировать ваши данные на диск, как вам угодно. Эта идея любезно предоставлена ​​Робом Нейпером:

http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588

Его код теперь также на GitHub:

https://github.com/rnapier/RNCachingURLProtocol

5 голосов
/ 31 января 2011

Я бы сначала попробовал пройти маршрут № 3.Возможно «Подстановка локальных данных для удаленных запросов UIWebView» на «Какао с любовью» будет вам полезна.

1 голос
/ 23 ноября 2011

Я бы рекомендовал против любого из вышеперечисленных подходов.

Я получил работу № 3, но это было очень, очень хрупко и трудно отлаживать. (Например, Apple уничтожает и воссоздает NSURLRequests, поэтому вы не можете просто создать подкласс NSURLRequest и ожидать его получения в последующем ответе.)

В конечном итоге (намного) стало проще в моей собственной истории назад и обратите внимание, какую страницу загружать, и положение прокрутки (вертикальное смещение экрана).

...