Skip to content

DNET_WebView

nishi_74322014 edited this page Sep 11, 2026 · 1 revision

WebView

概要

スマホネイティブから、ウェブコンテンツを表示するときに使用するコンポーネント。

Android

Android WebViewは

  • Androidアプリでウェブコンテンツを表示するときに使用できる。
  • Chromeの技術を使用したシステムコンポーネントである。
    • コンポーネントは端末にプリインストールされている。
    • 最新の状態に維持される(セキュリティアップデートやその他のバグ修正を反映)。

WebView(Android)

簡易ブラウザ開発(Android)

プロキシ(Android)

その他(Android)

iOS

iOSには、

  • UIWebViewと
  • WKWebView(UIWebViewの強化版)、
  • SFSafariViewController

というWebViewがある模様。

iOSのバージョンアップに従って機能が変更されている模様。

WebView(iOS)

簡易ブラウザ開発・プロキシ・その他(iOS)

(いずれも元 Wiki では見出しのみで未記載)

デバッグ

Android(デバッグ)

iOS(デバッグ)

(元 Wiki では未記載)

ハイブリッド開発

HTMLコンテンツから、JavaScriptを経由して、スマホネイティブのデバイスへアクセスする。

参考(ハイブリッド開発)

HTML→(JavaScript)→スマホネイティブ

スマホネイティブ→(JavaScript)→HTML

HTML→(JavaScript)→スマホネイティブの処理方式

onJsAlert方式

  • 対応デバイス

    • Androidのみ
  • 処理方式

    • window.alert()に渡された文字列をWebChromeClientのonJsAlert()で補足するハックを使用。
    • result.confirm()で全てのwindow.alert()が抑止されるので・・・。

addJavascriptInterface方式

  • 対応デバイス

    • Androidのみ
  • 処理方式

    • JavascriptにJavaのInterfaceを公開する。
  • 脆弱性がある。

    • HTTP/HTTPSのアクセスだけ許容する。
    • shouldOverrideUrlLoadingでURLチェックを行なう。
    • Android 4.2 Jelly Bean以降、公開するAPIを
      @JavascriptInterfaceアノテーションで指定可能になった。

Loopback Interface Redirection方式

  • 対応デバイス

    • Android and iOSをサポート
  • 処理方式

    • ローカル・ループバックでWebAPI連携
      (ローカルに、WebAPIの実行環境の構築が必要)

Private-Use URI Scheme Redirection方式

Private-Use URI Scheme Redirection

  • HTML:location.hrefで「apicall://」等、Private-Use URL Schemeを使用して呼び出す。

  • Android:上記の呼び出しを、

    • shouldOverrideUrlLoading()メソッドで補足する。
  • iOS :上記の呼び出しを、

    • shouldStartLoadWithRequest()メソッド(UIWebViewDelegateプロトコルを実装)で補足する。
    • NSURLProtocol.canInitWithRequest()メソッドで補足する。

スマホネイティブ→(JavaScript)→HTMLの処理方式

ネイティブ側からJavaScriptを実行し、JavaScriptのグローバル変数に値を代入する。

JSONライブラリ

Objectは渡せないので、JSONライブラリを用いて文字列にParseする。

Android(ネイティブ→HTML)

ネイティブ側からJavaScriptを実行する方法は、
loadUrlメソッドにjavascriptスキームのURLを読み込ませる。

webView.loadUrl("javascript:window.objectFromNative=" + new JSONObject().toString());

Android 4.4 (KitKat) でjavascriptを実行する場合、webview.loadUrlからwebview.evaluateJavascriptへ変更する必要がある(JavaScriptの実行を参照)。

iOS(ネイティブ→HTML)

ネイティブ側からJavaScriptを実行する方法は、
stringByEvaluatingJavaScriptFromStringメソッドを実行する。

  • 引数として渡したJavaScriptが実行される。
  • その評価したJavaScriptのコードの返り値を取得できる。
[webView evaluateJavaScript: @"window.objectFromNative = 'foobarvalue';"];

セキュリティ

Android(セキュリティ)

WebView#addJavascriptInterface(Android)

WebView#addJavascriptInterfaceは危険。

iOS(セキュリティ)

(元 Wiki では未記載)

バージョン間の差異

Android(バージョン間の差異)

Android 4.4 (KitKat)での変更が大きかった模様。

Migrating to WebView in Android 4.4 (KitKat)

JavaScriptの実行

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(バージョン間の差異)

(元 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

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally