20111204 WebBroser Control Tips for Windows Phone

Preview:

DESCRIPTION

2011年12月4日にスマートフォン勉強会@関東#16でお話させて頂きました。

Citation preview

WebBroser Control Tipsfor Windows Phone 7

スマートフォン勉強会@関東 #16CH3COOH( 酢酸 )

CH3COOH( 酢酸 ) スマートフォンプログラマ (29 歳 無

職 ) デバドラからアプリ、業務系バッチま

で ここ最近半年は、 WP7 アプリ開発中

心 ブログ 

http://d.hatena.ne.jp/ch3cooh393/ サイト  http://ch3cooh.jp/

自己紹介

VS2010 から WebBrowser を使う WebBrowser の基本的な機能 WebBrowser Control Tips まとめ

本日のアジェンダ

WebBrowser Control を使ってみよう

WebBrowserTask API 標準ブラウザ (IE Mobile) を連携起動

WebBrowser Control アプリ内で唯一ウェブページを表示させ

Windows Phone アプリでウェブページを閲覧する方法

Visual Studio でプロジェクトを作成 WebBrowser をドラッグアンドド

ロップ F5 で実行

VS2010 から WebBrowser を使う

たったこれだけ!

WebBrowser デモ

デモ内容 解説 (1)

デザイナーにドラッグ&ドロップ

デモ内容 解説 (2)

Source プロパティにURL を設定

WebBrowser コントロールが表示されると、http://ch3cooh.jp/ へ遷移します

デモ内容 解説 (3)

Windows Phone エミュレータで「酢酸の実験室 ( サイト名 ) 」が表示されれば、成功です!!

WebBrowser Control の基本的な機能

標準コントロールとして提供されている

基本的なウェブ閲覧の機能 ピンチイン・アウトによるズーム パンによるスクロール

アプリ側から JavaScript の実行 表示中コンテンツ側から通知を受けられ

WebBrowser Control

WebBrowser Control Tips

ページの遷移 レスポンスをフックしてページ遷移をキャンセル ローカルリソースの HTMLを表示する DataURIScheme で画像を表示する コンテンツに定義されている JavaScript Function を実行する コンテンツに定義されていない JavaScript を実行する タイトルや表示中の URLを取得する コンテンツ側から通知を受ける User Agent を偽装して iPhone用のページをみる 自動ログイン機能を実装する

WebBrowser Control Tips

WebBrowser.Navigate(Uri) メソッドでページ遷移を行います

遷移中にいくつかのイベントが発生

ページ遷移を行う

Navigating Event

Navigated Event

NavigationFailed Event

Navigating イベントでNavigatingEventArgs オブジェクトのCancel プロパティを「 True 」に設定することで遷移をキャンセルすることが可能です。

ページ遷移をキャンセル

private void webBrowser_Navigating(object sender, NavigatingEventArgs e) { // 2 ちゃんねるドメインであればページ遷移させない if (Regex.IsMatch(e.Uri.Host, "(?:.*\\.)2ch\\.net$")) { MessageBox.Show(" 本アプリは 2ch の閲覧を許可していません!"); e.Cancel = true; } }

string 型の HTML 文字列をパラメータに、WebBrowser.NavigateToString メソッドを使うことが出来ます。

ローカルの HTML を表示する その1 (1)

webBrowser.NavigateToString("<html><head></head><boby> テストページです。 </body>");

ただし、問題が・・・ WebBrowser.NavigateT

oString メソッドを使って表示させると、日本語が文字化ける

回避するには、 HTML 上の日本語を実態参照変換させる

ローカルの HTML を表示する その1 (2)

分離ストレージに格納した HTML ファイルを参照して表示させることが出来ます。

WebBrowser.Base プロパティには分離ストレージのディレクトリを指定 これが参照時の基本ディレクトリとなる

ローカルの HTML を表示する その2 (1)

// 基本ディレクトリを設定webBrowser.Base = "help";// 基本ディレクトリからの相対パスで About.html へ遷移webBrowser.Navigate(new Uri("About.html", UriKind.Relative));

Windows Phone OS 7.1 からは、 Base64 でエンコードした画像を表示することが出来ます

Data URI Scheme を使って画像を表示する

<html> <head></head> <body> <p><img width="125" height="125" src="data:image/png;base64,iVBORw0KGgoAAAANSU ……( 中略 )…… ORK5CYII=" /></p> <p> テストページです。 </p> </body></html>

JavaScript 関数を定義した HTML ファイルがあります

この関数をアプリ側からコールすることが出来ます

コンテンツで定義されているJavaScript を実行する ( 1 )

<html> <head> <script type="text/javascript"> function funcWithoutPram() { result.innerHTML = "called funcWithoutPram"; } </script> </head> <body> <div id="result">None Data. </div> </body></html>

WebBrowser.InvokeScript メソッドを使って実行します

JavaScript の関数の引数が複数個あっても、 InvokeScript(String, String[]) メソッドが用意されているので、引数が多い日でも安心です

コンテンツで定義されているJavaScript を実行する ( 2 )

webBrowser.InvokeScript("funcWithoutPram");

// 引数が 2 つの JavaScript を実行webBrowser.InvokeScript("funcWithPram2", " 引数 1", " 引数 2");

JavaScript には eval 関数というものがあります eval 関数は string 型の JavaScript のコードを引

数として渡すと実行してくれます

コンテンツで定義されていないJavaScript を実行する

// 表示しているタイトルを取得するvar title = webBrowser.InvokeScript("eval", "document.title");

// 表示している URL を取得するvar strURL = webBrowser.InvokeScript("eval", "document.URL");

コンテンツ側から window.external.notify メソッドを使ってアプリへ通知します

コンテンツから JavaScript を使ってアプリへ文字列を渡す

( 1 )

<html> <head> <script type="text/javascript"> function funcWithPram1(parm1) { window.external.notify(parm1); } </script> </head> <body> </body></html>

window.external.notify メソッドを実行すると、アプリ側で ScriptNotify イベントが発生します

コンテンツから JavaScript を使ってアプリへ文字列を渡す

( 2 )

// コンテンツからの Script 通知を受信するprivate void webBrowser_ScriptNotify(object sender, NotifyEventArgs e) { // コンテンツから渡された引数データをメッセージボックスで表示 MessageBox.Show(e.Value);}

カスタム HTTP ヘッダーを付与することが可能なWebBrowser.Navigate (Uri, String, String) メソッドを使うと、 User Agent を偽装出来る

User Agent を偽装してiPhone 用のページを閲覧する

var ua = "User-Agent:Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en)“;webBrowser1.Navigate(new Uri(URL), null, ua);

Yahoo!JAPAN のページです。 https://login.yahoo.co.jp/co

nfig/login?.src=www&.done=http://www.yahoo.co.jp

ID 部分の id は、 username パスワードの id は、 passwd

自動ログイン機能を実装する(1)

JavaScript のコード

InvokeScript のコード (C#)

自動ログイン機能を実装する(2)

document.getElementById('username').value = 'your_id';document.getElementById('passwd').value = 'your_password';document.forms['login_form'].submit();

var parm1 = string.Format(“document.getElementById(‘username’).value = ‘{0}’”,       username);var ret1 = (string)webBrowser1.InvokeScript("eval", parm1);var parm2 = string.Format(“document.getElementById(‘passwd’).value = ‘{0}’”,        password);var ret2 = (string)webBrowser1.InvokeScript("eval", parm2);webBrowser1.InvokeScript("eval", "document.forms['login_form'].submit();");

まとめ

WebBrowser は意外と使える子でした SavaToString メソッドで HTML の

キャッシュ ローカルリソース参照でヘルプページ

を InvokeScript メソッドと ScriptNotify

イベントで、 JavaScript を使ってHTML とアプリでデータ交換

まとめ

Windows Phone Advent Calendar “ ひとり” 2010 開催中

ATND: http://atnd.org/events/22862

会場 : http://d.hatena.jp/ch3cooh393/

告知

ご清聴ありがとうございました