Сопоставить собственный протокол URL с HTTP (используя NSURLProtocol?) - PullRequest
7 голосов
/ 12 мая 2010

У меня есть приложение, использующее WebKit WebView, и я хотел бы сопоставить URL-адреса, загруженные в этом WebView, с настраиваемым протоколом URL-адресов с другим HTTP-URL. Например, скажите, что я загружаюсь:

обычай: // путь / к / ресурс

Я бы хотел на самом деле загрузить:

http://something -else.com / путь / к / ресурс

Другими словами, пользовательский протокол служит почти сокращением. Однако я не могу использовать -webView: resource: willSendRequest: redirectResponse: fromDataSource:, потому что я хочу, чтобы WebKit действительно поверил, что это URL-адрес, а не просто перенаправляет с одного на другой.

До сих пор я пытался использовать пользовательский подкласс NSURLProtocol. Однако это оказывается сложнее, чем я думал, потому что, по крайней мере, насколько я понимаю, мне придется самому загружать данные в метод startLoading подкласса NSURLProtocol. Я хотел бы просто передать работу существующему загрузчику протокола HTTP, но я не могу найти простой способ сделать это.

У кого-нибудь есть рекомендации для этого или, возможно, альтернативный способ решения этой проблемы?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Я использую делегат политики. У него есть некоторые недостатки, но он прост и достаточен для моих нужд. Я делаю что-то вроде этого:

 - (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id < WebPolicyDecisionListener >)listener;

{
    if ([request.URL.scheme isEqualToString:@"custom"]) {

        // do something interesting
        // like force the webview to load another URL

        [listener ignore];
        return;
    }

    [listener use];
}

Для моего использования мне также нужно остановить распространение событий JS. Поэтому я обычно помещаю URL в обработчик события onclick, который вызывает window.event.stopPropagation (); после настройки location.href.

Это не очень необычно, но это очень гибкий и очень простой способ сообщить событие JS какао.

0 голосов
/ 12 сентября 2010

Вы можете реализовать метод WebResourceLoadDelegate:

- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource

Это должно позволить вам изменить запрос для HTTP-адреса.

В качестве альтернативы реализация подкласса NSURLProtocol не очень сложна для этого, потому что ваш протокол может внутренне запустить другой NSURLConnection, используя правильный URL-адрес HTTP, и сопоставить его методы делегата с клиентом протокола.

...