強火で進め

このブログではプログラム関連の記事を中心に書いてます。

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とアプリが連携出来るのでそのような場面ではどんどん使いましょう。

ChromeのDev版でWebGLがデフォルトでONに

ChromeのDev版でWebGLがデフォルトでONになったみたいです。
今までみたいに引数付きで起動しなくてもWebGLが有効に成っています。
※あくまで開発者版なので色々と自己責任で試しましょう。


Dev版を使った後、通常配布版の最新のものを立ち上げるとこんな表示が出る様になりましたorz でもまぁ、これも自己責任。

こちらにこうなった時の対処法を書きました。

ChromeのDev channel版と通常リリース版とを共存させる方法 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20101005/1286287073

情報やDL先はこちら。

Google Chrome Releases: Dev Channel Update
http://googlechromereleases.blogspot.com/2010/09/dev-channel-update_30.html

Early Access Release Channels - The Chromium Projects
http://dev.chromium.org/getting-involved/dev-channel

以前紹介した水族館のデモなどもMacBookでも38〜45fps位で動作しました。

Chromiumの方も引数無しでWebGLが有効に成っている様です。こちらを起動するした時は「プロフィール」の件のエラーダイアログは表示されませんでした。ちなみにこちらでも水族館のデモを動作させたみたところこちらは15〜17fps位で動作しました。

Index of /buildbot/continuous/mac/LATEST
http://build.chromium.org/buildbot/continuous/mac/LATEST/

ChromeのDev channel版と通常リリース版とを共存させる方法

Macで通常(一般)リリース版のChromeをインストール済みの時にそのChromeとは別のディレクトリにChromeのDev channel版をインストールし、色々とテストをした後に通常リリース版のChromeを起動すると以下の様なエラーが表示されました。

うわぁ〜。とtwitterで嘆いて居たところ --user-data-dir= というやつでユーザデータディレクトリを分ければ大丈夫という情報を教えて貰いました。

自分でもなんでこれでOKなのか理解しておくために「user-data-dir chrome」で調べてみたところ直ぐに以下のサイトが見つかりました。

User Data Directory - The Chromium Projects
http://www.chromium.org/user-experience/user-data-directory

最初の方にデフォルトの User Data Directory の位置の説明が有り、次に有る「Running From A Custom Location」の項目に実際の設定方法が記述されていました。

ここではAppleScriptで以下の様に記述する様にと書かれていました。

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/$USER/Library/Application\\ Support/Google/ChromePersonal > /dev/null 2>&1 &" 

自分の場合はDev版をApplicationsディレクトリに Google Chrome(Dev Channel) というディレクトリを作成して置いてるのでパス指定を /Applications/Google Chrome(Dev Channel)/Google Chrome.app に変更し、 User Data Directory をChromeDevに設定しました。

/アプリケーション/ユーティリティ に有る AppleScript エディタ.app を起動し、以下の内容を貼り付けました。

do shell script "/Applications/Google\\ Chrome\\(Dev\\ Channel\\)/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/$USER/Library/Application\\ Support/Google/ChromeDev > /dev/null 2>&1 &" 

その後、 Command+sで保存。保存時に「ファイルフォーマット」を「アプリケーション」にして保存します。

作成されたアプリをダブルクリックで起動するとDev channel版のChromeが起動します。Dev channel版はこのアプリから、通常リリース版は今まで通り、アプリのアイコンをダブルクリックで起動する様にすればエラーが表示される事なく共存出来ます。

既に一度、Dev channel版を普通に起動してしまった場合は自分の場合は以下の手順で復帰できました。
(注意)設定はリセットされてしまいます。

~/Library/Application Support/Google/Chrome/Default

を削除する。

Creating and Using Profiles - The Chromium Projects
http://www.chromium.org/developers/creating-and-using-profiles