将自定义URL协议映射到HTTP(使用NSURLProtocol?)

Fra*_*y I 7 cocoa webkit nsurlprotocol

我有一个使用WebKit WebView的应用程序,我想将使用自定义URL协议加载到此WebView中的URL映射到不同的HTTP URL.例如,假设我正在加载:

定制://路径/到/资源

我想在内部实际加载:

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

换句话说,自定义协议几乎用作速记.但我不能使用-webView:resource:willSendRequest:redirectResponse:fromDataSource :,因为我希望WebKit实际上相信这是有问题的URL,而不是简单地从一个重定向到另一个.

到目前为止,我一直在尝试使用自定义NSURLProtocol子类.然而,这比我最初想的要复杂,因为至少根据我的理解,我将不得不在NSURLProtocol子类'startLoading方法中进行实际加载.我想要一种方法将工作交给现有的HTTP协议加载器,但我找不到一种简单的方法来做到这一点.

有没有人对此提出建议,或者可能是另一种解决此问题的方法?

谢谢!

isa*_*iah 3

我使用策略委托。它有一些缺点,但它很简单并且足以满足我的需求。我做了这样的事情:

 - (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];
}
Run Code Online (Sandbox Code Playgroud)

为了我的使用,我还需要停止 JS 事件的传播。因此,我通常将 URL 放置在调用 window.event.stopPropagation(); 的 onclick 事件处理程序中。设置location.href后。

它不是很花哨,但它是一种非常灵活且非常简单的将 JS 事件传递给 cocoa 的方法。