「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
スマホネイティブから、ウェブコンテンツを表示するときに使用するコンポーネント。
Android †
Android WebViewは
- Androidアプリでウェブコンテンツを表示するときに使用できる。
- Chromeの技術を使用したシステムコンポーネントである。
- コンポーネントは端末にプリインストールされている。
- 最新の状態に維持される(セキュリティアップデートやその他のバグ修正を反映)。
簡易ブラウザ開発 †
プロキシ †
その他 †
iOS †
Android WebViewには、
というWebViewがある模様。
iOSのバージョンアップに従って機能が変更されている模様。
簡易ブラウザ開発 †
プロキシ †
その他 †
デバッグ †
Android †
iOS †
ハイブリッド開発 †
HTMLコンテンツから、JavaScriptを経由して、スマホネイティブのデバイスへアクセスする。
参考 †
- 書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門
onJsAlert?方式 †
- 処理方式
- window.alert()に渡された文字列をWebChromeClient?のonJsAlert?()で補足するハックを使用。
- result.confirm()で全てのwindow.alert()が抑止されるので・・・。
addJavascriptInterface?方式 †
- 処理方式
- JavascriptにJavaのInterfaceを公開する。
- 脆弱性がある。
- HTTP/HTTPSのアクセスだけ許容する。
- shouldOverrideUrlLoading?でURLチェックを行なう。
- Android 4.2 Jelly Bean以降、公開するAPIを
@JavascriptInterface?アノテーションで指定可能になった。
Loopback Interface Redirection方式 †
- 処理方式
- ローカル・ループバックでWebAPI連携
(ローカルに、WebAPIの実行環境の構築が必要)
- HTML:location.hrefで「apicall://」等、Private-Use URL Schemeを使用して呼び出す。
- Android:上記の呼び出しを、
- shouldOverrideUrlLoading?()メソッドで補足する。
- iOS :上記の呼び出しを、
- shouldStartLoadWithRequest?()メソッド(UIWebViewDelegate?プロトコルを実装)で補足する。
- NSURLProtocol.canInitWithRequest?()メソッドで補足する。
ネイティブ側からJavaScriptを実行し、JavaScriptのグローバル変数に値を代入する。
JSONライブラリ †
Objectは渡せないので、JSONライブラリを用いて文字列にParseする。
Android †
ネイティブ側からJavaScriptを実行する方法は、
loadUrlメソッドにjavascriptスキームのURLを読み込ませる。
webView.loadUrl("javascript:window.objectFromNative=" + new JSONObject().toString());
Android 4.4 (KitKat) でjavascriptを実行する場合、webview.loadUrlからwebview.evaluateJavascriptへ変更する必要がある。
iOS †
ネイティブ側からJavaScriptを実行する方法は、
stringByEvaluatingJavaScriptFromString?メソッドを実行する。
[webView evaluateJavaScript: @"window.objectFromNative = 'foobarvalue';"];
セキュリティ †
Android †
WebView#addJavascriptInterface?(Android) †
WebView#addJavascriptInterface?は危険。
- スマートフォンアプリへのブラウザ機能の実装に潜む危険 WebViewクラスの問題について:CodeZine?(コードジン)
- WebChromeClient?#onJsAlert?を使う方法
iOS †
バージョン間の差異 †
Android †
Android 4.4 (KitKat?)での変更が大きかった模様。
Migrating to WebView in Android 4.4 (KitKat?) †
https://gist.github.com/seamountain/7415057#multi-threading-and-thread-blocking
- Android 4.4 (KitKat?) でjavascriptを実行する場合、
webview.loadUrlからwebview.evaluateJavascriptへ変更する必要があるのだが、
- この理由は、「webview.loadUrlだと、JavaScript のCallbackを待つのに、
UIスレッドをブロックするしか無いため。」と書かれている。
- Callbackを持つevaluateJavascriptに変更する。
- loadUrlメソッドではJavaScriptスキームを実行できなくなっている。
Signature †
- WebViewClient?
- public void onReceivedError?
- onReceivedError?(WebView view, int errorCode, String description, String failingUrl)
- onReceivedError?(WebView view, WebResourceRequest? request, WebResourceError? error)
- public boolean shouldOverrideUrlLoading?
- shouldOverrideUrlLoading?(WebView view, String url)
- shouldOverrideUrlLoading?(WebView view, WebResourceRequest? request)
iOS †
???