2011-01-04 3 views
4

私はUIWebViewに基づいたiPadアプリで作業しています。できるだけ簡単に説明するために、1つの大きなインタラクティブなWebviewが表示され、カスタムジェスチャーもサポートされています。UIWebViewで未使用のタップイベントを傍受する

タップがまだwebviewで消費されていない場合(つまり、スクロール/ズーム操作の開始ではない、リンク上のタップではない場合のみ)、WebViewでシングルタップを表すイベントを捕捉する必要があります。 、彼らはいくつかのJavaScriptを引き起こすタップではありません)。

UIWebViewは、イベントで非常に欲張りです。私の経験上、UIWebViewは消費されていなくても、伝播しない傾向があります。イベントをキャッチするために、メインUIWindowのサブクラス化が終了しました(http://mithin.in/2009/08/26/detecting-taps-and-events-on-uiwebview-the-right-way/参照)。これはうまくいっていますが、問題は私がタップがWebビューでいくつかのJavaScriptを起動したかどうかを認識できないことです。

追加の制限として、UIWebViewまたは表示されるHTMLで実行されるjavascriptを制御できません。

このように、問題は次のようになります。UIWebView自体、特にjavascriptアクションで他のアクションを引き起こさなかったタップイベントのみを検出する方法は何でしょうか?

あなたは好奇心旺盛であるべき、私が働いているプロジェクトのソースコードはGitHubの上にある:ちょうどベーカーフレームワークにあなたを指すようにGoogleに依頼し、それを見つけるために。

答えて

4

JavaScriptでこれを行います。まず、あなたのwebviewの読み込みが終了したら、使用していないクリックを吸収するためにjavascriptのクリックハンドラを本文に付けます。それは行動だとして、それが作られたアップドメインをロードする必要があり:あなたのWebViewのデリゲートに次に

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString *script = @"document.body.onclick = function() { document.location.href = 'http://clickhandler'; }" 
    [webView stringByEvaluatingJavaScriptFromString:script]; 
} 

、その構成されたドメインをロードし、それらを傍受しようとする試みのために外を見ます。これで、ネイティブコードとそのjavascriptのクリックハンドラを傍受する方法を持っているし、それに応じて反応する:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if ([request.URL.host isEqualToString:@"clickhandler"]) 
    { 
     //handle click 
     //your logic here 
     return NO; 
    } 
    return YES; 
} 
+2

+1むしろ偽のホストを使用するよりも、私は通常、カスタムスキームを使用することをお勧めします。したがって、 'http:// clickhandler'の代わりに、' handler: 'をお勧めし、' request.URL.scheme'を使ってそれをチェックします。これにより、 'handle:click'のようなデータを簡単に渡すことができ、偽のホストよりも明示的です。 –

+0

私はもともとそれも考えましたが、それは良い考えではありません。サポートされているスキームをinfo.plistに追加しない限り、カスタムスキームは機能しません。誰でもそのスキームをSafariに入力すると、アプリを起動します。これは内部的なものあなたのアプリのためのプロトコル。トップレベルドメインを持たない(末尾に.comがない)偽のホストでhttp://を使用すると、実際のドメインと衝突する可能性がないため安全です。 –

+0

私はこれを常にしています。 Webviewデリゲートでキャプチャするためにカスタムスキームを登録する必要はありません。あなたが他のアプリからあなたに転送されるようにするには、それを登録する必要があります。 –

関連する問題