-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_WebView
スマホネイティブから、ウェブコンテンツを表示するときに使用するコンポーネント。
Android WebViewは
- Androidアプリでウェブコンテンツを表示するときに使用できる。
- Chromeの技術を使用したシステムコンポーネントである。
- コンポーネントは端末にプリインストールされている。
- 最新の状態に維持される(セキュリティアップデートやその他のバグ修正を反映)。
- WebView | Android Developers
https://developer.android.com/reference/android/webkit/WebView.html
-
Androidでウェブブラウザを作ろう (全12回) - プログラミングならドットインストール
http://dotinstall.com/lessons/browser_android_v2 -
Androidアプリ開発でWebViewを追加する方法【初心者向け】 | TechAcademyマガジン
https://techacademy.jp/magazine/3503 -
Android StudioでwebViewを使ってみる! - Qiita
http://qiita.com/sy_sft_/items/508870dfccfb237d72fd -
WebViewを使ったアプリ作成 - Okomeda Net
-
参考
- android WebView internet access problem, because of proxy? - Stack Overflow
http://stackoverflow.com/questions/6673159/android-webview-internet-access-problem-because-of-proxy
- android WebView internet access problem, because of proxy? - Stack Overflow
-
やってみたところ。
- 最新のもので、WebView.enablePlatformNotifications()メソッドが発見できず。
- また、上記が、プロキシ認証に対応しているかどうかが不明。
- 潔く、ローカル・プロキシを使用するようにした(Android開発の該当節を参照)。
- Android エンジニアが Android の WebView で苦しんだ話 - Qiita
http://qiita.com/akitaika_/items/654dafa26e1d1dd0d3dd
iOSには、
- UIWebViewと
- WKWebView(UIWebViewの強化版)、
- SFSafariViewController
というWebViewがある模様。
iOSのバージョンアップに従って機能が変更されている模様。
-
WKWebViewとUIWebView
http://www.slideshare.net/yukihirai52/wkwebviewanduiwebview -
iOS 9のUIWebViewがとても残念らしいので
WKWebViewに対応したCordova iOS 4.0(未リリース)を試してみる
https://inoccu.com/blog/2015/09/19/230210.html
(いずれも元 Wiki では見出しのみで未記載)
- [Android] WebView に読み込んだ JavaScript アプリケーションを
Chrome Developer Tools でデバッグする
http://qiita.com/hkusu/items/fca23e0fa5cfb1b7fe1f
(元 Wiki では未記載)
HTMLコンテンツから、JavaScriptを経由して、スマホネイティブのデバイスへアクセスする。
-
[iOS/Android対応] HTML5 ハイブリッドアプリ開発[実践]入門 (Software Design plus)
https://www.amazon.co.jp/Android対応-HTML5-ハイブリッドアプリ開発-Software-Design/dp/4774162116- 書籍転載:[iOS/Android対応]HTML5ハイブリッドアプリ開発[実践]入門
- PhoneGap/Cordova:addJavascriptInterface方式(前編) - Build Insider
JavaScriptからネイティブの機能を呼び出す方法
http://www.buildinsider.net/mobile/bookhtml5hybrid/1101- JsAlert方式
- addJavascriptInterface方式
- Loopback Interface Redirection方式
- Private-Use URI Scheme Redirection方式
- PhoneGap/Cordova:addJavascriptInterface方式(後編) - Build Insider
ネイティブからJavaScriptへ値を渡す
http://www.buildinsider.net/mobile/bookhtml5hybrid/1102
-
対応デバイス
- Androidのみ
-
処理方式
- window.alert()に渡された文字列をWebChromeClientのonJsAlert()で補足するハックを使用。
- result.confirm()で全てのwindow.alert()が抑止されるので・・・。
-
対応デバイス
- Androidのみ
-
処理方式
- JavascriptにJavaのInterfaceを公開する。
-
脆弱性がある。
- HTTP/HTTPSのアクセスだけ許容する。
- shouldOverrideUrlLoadingでURLチェックを行なう。
- Android 4.2 Jelly Bean以降、公開するAPIを
@JavascriptInterfaceアノテーションで指定可能になった。
-
対応デバイス
- Android and iOSをサポート
-
処理方式
- ローカル・ループバックでWebAPI連携
(ローカルに、WebAPIの実行環境の構築が必要)
- ローカル・ループバックでWebAPI連携
Private-Use URI Scheme Redirection
-
HTML:location.hrefで「apicall://」等、Private-Use URL Schemeを使用して呼び出す。
-
Android:上記の呼び出しを、
- shouldOverrideUrlLoading()メソッドで補足する。
-
iOS :上記の呼び出しを、
- shouldStartLoadWithRequest()メソッド(UIWebViewDelegateプロトコルを実装)で補足する。
- NSURLProtocol.canInitWithRequest()メソッドで補足する。
ネイティブ側からJavaScriptを実行し、JavaScriptのグローバル変数に値を代入する。
Objectは渡せないので、JSONライブラリを用いて文字列にParseする。
ネイティブ側からJavaScriptを実行する方法は、
loadUrlメソッドにjavascriptスキームのURLを読み込ませる。
webView.loadUrl("javascript:window.objectFromNative=" + new JSONObject().toString());Android 4.4 (KitKat) でjavascriptを実行する場合、webview.loadUrlからwebview.evaluateJavascriptへ変更する必要がある(JavaScriptの実行を参照)。
ネイティブ側からJavaScriptを実行する方法は、
stringByEvaluatingJavaScriptFromStringメソッドを実行する。
- 引数として渡したJavaScriptが実行される。
- その評価したJavaScriptのコードの返り値を取得できる。
[webView evaluateJavaScript: @"window.objectFromNative = 'foobarvalue';"];WebView#addJavascriptInterfaceは危険。
-
スマートフォンアプリへのブラウザ機能の実装に潜む危険 WebViewクラスの問題について:CodeZine(コードジン)
- http://codezine.jp/article/detail/6618
-
http://codezine.jp/article/detail/6618?p=2
- 特定のURLのみに限定する
- http/httpsプロトコルのみに限定する
-
AndroidのWebView#addJavascriptInterfaceがどれだけ危険か検証してみた (Kanasansoft Web Lab.)
http://www.kanasansoft.com/weblab/2012/04/webview_addjavascriptinterface_of_android_is_dangerous.html -
AndroidのWebView#addJavascriptInterfaceは基本使わない方がいい、っていう話 - 愛と勇気と缶ビール
http://zentoo.hatenablog.com/entry/20120507/1336399651- インタフェースは貧弱だが安全なAPIを用いるとイイ。
- WebChromeClient#onJsAlert
- WebChromeClient#onJsPrompt
- インタフェースは貧弱だが安全なAPIを用いるとイイ。
-
WebChromeClient#onJsAlertを使う方法
- Android の WebView で addJavascriptInterface を使わず情報を渡す - Qiita
http://qiita.com/ka_/items/f8dcde7893f3a029f151- AppとWebViewの相互の機能の呼び方、
そしてhistory.back()について(iPhone・Android) | ひささん日記
http://tech.hisasann.com/javascript/46/ - AndroidのWebViewでJavaScriptを実行する
http://dayafterneet.blogspot.jp/2011/08/androidwebviewjavascript.html
- AppとWebViewの相互の機能の呼び方、
- Android の WebView で addJavascriptInterface を使わず情報を渡す - Qiita
(元 Wiki では未記載)
Android 4.4 (KitKat)での変更が大きかった模様。
- Migrating to WebView in Android 4.4 | Android Developers
https://developer.android.com/guide/webapps/migrating.html - Migrating to WebView in Android 4.4 翻訳
https://gist.github.com/seamountain/7415057
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スキームを実行できなくなっている。
- 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)
-
(元 Wiki では「???」のみ)
移行メモ
- iOS の節の書き出しが「Android WebViewには、」となっていたが、 列挙されているのは iOS の WebView(UIWebView / WKWebView / SFSafariViewController)のため「iOSには、」に修正した。
- 「iOS(ネイティブ→HTML)」の本文は UIWebView の
stringByEvaluatingJavaScriptFromStringを説明しているが、 コード例は WKWebView のevaluateJavaScript:になっている(元 Wiki の記載どおり)。- 本文の無い見出しは統合・箇条書きにまとめ、未記載である旨を明示した (iOS 配下の「簡易ブラウザ開発」「プロキシ」「その他」、 デバッグ・セキュリティ・バージョン間の差異の各「iOS」)。
- 同名の見出し(「Android」「iOS」「WebView」「簡易ブラウザ開発」「プロキシ」 「その他」「参考」)が複数あり GitHub Wiki でアンカが衝突するため、 括弧で文脈を補って一意にした。
- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。- 本フェーズで新たに参照された「Private-Use URI Scheme Redirection」を TODO.md に予約した。
Tags: 移行, WebView, Android, iOS, ハイブリッドアプリ, addJavascriptInterface, セキュリティ, KitKat
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。