以下のメソッド内で外部リンクかどうか判断し、外部リンクの場合はネイティブブラウザを開くようにできるのですが、iOSのWebViewはややこしいことにiframeのリクエスト時もここに入ってきてしまいます。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest: (NSURLRequest *)request navigationType: (UIWebViewNavigationType)navigationType {-
これだと計測用のiframeのリクエストもこのメソッド内に入るので、外部URLだった場合にネイティブブラウザで開くという挙動を入れると、このiframeのリクエスト時にも反応してしまいます。
そこで方法としては、クリックした場合にのみ外部リンクかどうかを判断するようにするという方法があります。
シンプルなサンプルですが、以下のような雰囲気。
NSString *absoluteUrl = request.URL.absoluteString; // 外部リンクをクリックした場合には、デバイスのデフォルトブラウザを起動する NSRange range = [absoluteUrl rangeOfString:@'domain']; if (range.location == NSNotFound) { if (navigationType == UIWebViewNavigationTypeLinkClicked) { [[UIApplication sharedApplication] openURL:request.URL]; return NO; } }
そして、WebView側のコードに以下のようにクリックイベントをfireするコードで置き換えます。
もしもアンカーリンクなどをクリックする場合は以下のコードは不要ですが、何かしらJavaScriptでURLを作ってlocation.hrefに入れている場合には置き換えが必要になります。
$("#hoge")[0].dispatchEvent(click()); function click(){ var event = document.createEvent("HTMLEvents"); event.initEvent('click', true, false); return event; };
AndroidのWebViewはiframeなどはshouldOverrideUrlLoadingメソッドの中に入ってこないので、楽なのですが、
iOSは結構ややこしいですね。
作ればわかる!Androidプログラミング―10の実践サンプルで学ぶAndroidアプリ開発入門 (Smart Mobile Developer)
posted with amazlet at 13.04.08
金宏 和實
翔泳社
売り上げランキング: 11,053
翔泳社
売り上げランキング: 11,053