7

WebKit WebView を使用するアプリケーションがあり、カスタム URL プロトコルを使用してこの WebView に読み込まれた URL を別の HTTP URL にマップしたいと考えています。たとえば、次のように読み込んでいるとします。

custom://path/to/resource

内部的に実際にロードしたい:

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

言い換えれば、カスタム プロトコルはほぼ省略形として機能します。ただし、-webView:resource:willSendRequest:redirectResponse:fromDataSource: を使用することはできません。これは、単に一方から他方にリダイレクトするのではなく、これが問題の URL であると WebKit に実際に信じさせたいためです。

これまでのところ、カスタム 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イベントの伝播も停止する必要があります。したがって、私は通常、window.event.stopPropagation();を呼び出すonclickイベントハンドラーにURLを配置します。location.hrefを設定した後。

それほど派手ではありませんが、JSイベントをココアに伝えるための非常に柔軟で非常に簡単な方法です。

于 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 に答える