強火で進め

このブログではプログラム関連の記事を中心に書いてます。こちらで( http://blog.livedoor.jp/tsuyobi-outdoor/ ) アウトドア関連の記事も書いてます。

UIWebViewでリンクをクリックされたときのデフォルト動作を変更する


ここでは例としてこちらのWebページをUIWebViewで読み込み、そのリンクをクリックした時の動作を置き換えます。

UIWebViewでリンクをクリックした場合には以下のdelegateが呼ばれます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

ここで navigationType の値をチェックすると何のイベントで呼ばれたかが確認できます。

ここにはサブミット(フォーム入力時のsumbitボタンが押されたとき)のときには UIWebViewNavigationTypeFormSubmitted 、リロードされた時には UIWebViewNavigationTypeReload などその状況に応じた値が入っています。

今回はリンクをクリックしたタイミングを取りたいので以下の様に書きます。

	if(navigationType == UIWebViewNavigationTypeLinkClicked) {

全体としては以下の様に記述しました。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
	if(navigationType == UIWebViewNavigationTypeLinkClicked) { // リンクがクリックされた
		NSString *query = [[request URL] query];
		NSLog(@"query : %@", query);
		if ([@"hoge=1" compare:query] == NSOrderedSame) { // queryが hoge=1 のものはデフォルトの動作を抑止(return NO;)
			UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil 
															message:@"クリック時の動作はアプリが頂いた!!"
														   delegate:self 
												  cancelButtonTitle:nil 
												  otherButtonTitles:@"OK", nil];
			[alert show];
			[alert release];
			return NO;
		} else if ([@"hoge=2" compare:query] == NSOrderedSame) {
			UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil 
															message:@"クリック時の動作はアプリが頂いた!!\nJavaScriptの関数( test2() )も動作させない!!"
														   delegate:self 
												  cancelButtonTitle:nil 
												  otherButtonTitles:@"OK", nil];
			[alert show];
			[alert release];
			return NO;
		}
	}
	return YES;
}

request には飛び先URLの情報が入っているのでここではクエリの情報を元に処理を分けています。

後、既存のJavaScriptの関数に手を加える為にページの読み込みが完了した時に呼ばれる - (void)webViewDidFinishLoad:(UIWebView *)webView のタイミングで以下の処理を行っています。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
	[webView_ stringByEvaluatingJavaScriptFromString:@"test2 = function(){}"];
	[webView_ stringByEvaluatingJavaScriptFromString:@"test3 = function(){document.body.style.background='green'; alert('自然を大切に!!');}"];
}

test2() は既存のアラートを表示する処理から何も行わない様に変更。 test3() は背景色の変更と別のアラートメッセージを表示する様に変更しました。

今回のサンプルはこちらからDL出来ます。

この機能を使うと上手くWebとアプリが連携出来るのでそのような場面ではどんどん使いましょう。