У меня есть приложение с помощью веб-представления WebKit, и я хотел бы отобразить URL, которые загружаются в этом веб-представлении с пользовательским протоколом URL к другому URL HTTP. Например, скажите, что я загружаюсь:
custom://путь/к/ресурс
Я хотел бы внутренне на самом деле загрузка:
http://something-else.com/path/to/resource
Другими словами, пользовательский протокол служит почти в качестве стенографии. Я не могу однако использовать-webView:resource:willSendRequest:redirectResponse:fromDataSource: потому что я хочу, чтобы WebKit на самом деле полагал, что это - рассматриваемый URL, для не простого перенаправления от одного до другого.
До сих пор я пытался использовать пользовательский подкласс NSURLProtocol. Однако это оказывается более хитрым, чем я сначала думал, потому что, по крайней мере, к моему пониманию, я должен буду сделать фактическую загрузку меня в startLoading методе подкласса NSURLProtocol. Я хотел бы способ просто вручить от работы существующему загрузчику протокола HTTP, но я не могу найти простой способ сделать это.
У кого-либо есть рекомендация для этого или возможно альтернативный способ решить эту проблему?
Спасибо!
Я использую делегат политики. У него есть недостатки, но он простой и достаточный для моих нужд. Я делаю что-то вроде этого:
- (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 какао.