Отобразите Пользовательский протокол URL на HTTP (использующий NSURLProtocol?)

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

custom://путь/к/ресурс

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

http://something-else.com/path/to/resource

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

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

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

Спасибо!

7
задан Francisco Ryan Tolmasky I 12 May 2010 в 06:51
поделиться

1 ответ

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

 - (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 какао.

3
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: