【问题标题】:Map Custom URL protocol to HTTP (using NSURLProtocol?)将自定义 URL 协议映射到 HTTP(使用 NSURLProtocol?)
【发布时间】:2011-02-18 11:34:03
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: cocoa webkit nsurlprotocol


    【解决方案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 放在调用 window.event.stopPropagation(); 的 onclick 事件处理程序中。设置 location.href 后。

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

    【讨论】:

    • 这是否具有使 webview 认为它在自定义协议 URL 上的效果?如果我只是从该 if 块加载一个新 URL,我觉得我将处于与以前相同的位置:有效地创建重定向。但也许我误解了我应该从那里加载新 URL 的方式。
    • “这是否有让 webview 认为它在自定义协议 URL 上的效果?”不,绝对不是。如果您的目标是将 href.location 设置为一件事并加载另一件事,那么此解决方案将无法让您到达那里。对不起。在这种情况下,当检测到自定义方案时,即使它被杀死 - 所以 location.href 永远不会改变。 “有效地创建重定向”它与重定向不同。在重定向中,第一个 URL 被加载、处理等。然后下一个 URL 被加载。使用策略委托并调用 [listener ignore] 会完全终止第一个 URL 加载。
    【解决方案2】:

    你可以实现WebResourceLoadDelegate方法:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 2011-04-27
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多