7

我有一个使用 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 协议加载器的方法,但我找不到一个简单的方法来做到这一点。

有没有人对此有建议,或者可能有解决此问题的替代方法?

谢谢!

4

2 回答 2

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];
}

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

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

于 2010-05-12T07:24:12.990 回答
0

您可以实现该WebResourceLoadDelegate方法:

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

这应该允许您使用 HTTP URL 更改请求。

或者,NSURLProtocol为此实现一个子类并不难,因为您的协议可以在内部NSURLConnection使用正确的 HTTP URL 启动另一个子类,并将其委托方法映射到协议客户端的。

于 2010-09-12T09:59:53.293 回答