モバイル デバイス用のウェブページやアプリケーションの開発には、デスクトップ ウェブブラウザ用のウェブページの開発とは異なり、さまざまな課題があります。Android などのモバイル デバイス向けに最も効果的なウェブ アプリケーションを提供するための方法を以下に示します。
- 専用のモバイル版ウェブサイトにモバイル デバイスをリダイレクトします。サーバーサイドのリダイレクトを使用してこれを行う方法はいくつかあります。一般的な方法の 1 つは、ウェブブラウザから提供された User Agent 文字列を「スニッフィング」することです。モバイル版のサイトを提供するかどうかを判断するには、User Agent で「mobile」という文字列を探します。
- モバイル デバイス向けに HTML5 を使用します。モバイルサイトで最も一般的なマークアップ言語は HTML5 です。この規格はモバイル ファーストの開発を促進し、さまざまなデバイスでのウェブサイトの動作を保証します。従来のウェブ言語とは異なり、HTML5 ではよりシンプルな
<DOCTYPE>とcharsetの宣言が使用されます。<!DOCTYPE html> ... <meta charset="UTF-8">
- ビューポートのメタデータを使用して、ウェブページのサイズを適切に調整します。ドキュメントの
<head>で、メタデータを提供します。メタデータは、ブラウザのビューポートでウェブページをレンダリングする方法を指定します。たとえば、ビューポートのメタデータで、ブラウザのビューポートの高さと幅、最初のページのスケール、ターゲット画面の密度を指定できます。次の例は、ビューポートのメタデータを設定する方法を示しています。
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
Android デバイスでビューポートのメタデータを使用する方法については、ウェブアプリでさまざまな画面をサポートするをご覧ください。
- 縦長のレイアウトを使用します。ユーザーがページを移動している間、左右にスクロールしないで済むようにします。ユーザーにとって上下にスクロールするほうが簡単であり、ページがシンプルになります。
- レイアウトの高さと幅を
match_parentに設定します。WebViewオブジェクトの高さと幅をmatch_parentに設定すると、アプリのビューサイズが適切に調整されます。高さをwrap_contentに設定すると、サイズ設定が適切でなくなるため、設定しないことをおすすめします。同様に、レイアウト幅をwrap_contentとする設定はサポートされていないため、WebViewは代わりに親の幅を使用します。このような動作であるため、WebViewオブジェクトの親レイアウト オブジェクトの高さと幅がwrap_contentに設定されていないことを確認することも重要です。 - 複数のファイル リクエストを回避します。通常、モバイル デバイスの接続速度はデスクトップ パソコンよりも遅いため、ページの読み込みをできるだけ速くする必要があります。これを高速化する方法の 1 つとして、スタイルシートやスクリプト ファイルなどの余分なファイルを
<head>に読み込まないようにすることが挙げられます。また、アプリに固有の最適化案について詳しくは、Google の PageSpeed Insights でモバイル分析を実施することをおすすめします。 - ファビコンの自動ダウンロードが不要な場合は無効にします。
デフォルトでは、ナビゲーション時にサイトにアクセスするたびに、
WebViewがファビコンを自動的にダウンロードします。WebViewは、ダウンロードした各ファビコンのコピーを 2 つ(Java とネイティブ メモリに 1 つずつ)保持するため、ファビコンのダウンロードを無効にすると、メモリ(WebViewインスタンスあたり約 8 KB)を節約し、帯域幅の使用量を削減できます。アプリでファビコンを使用または表示しない場合は、Jetpack Webkit ライブラリのWebSettingsCompat.setDownloadFaviconsEnabled()を使用して自動ダウンロードを無効にします。Kotlin
// In this example, "myWebView" is an instance of WebView. if (WebViewFeature.isFeatureSupported(WebViewFeature.DOWNLOAD_FAVICONS_ENABLED)) { WebSettingsCompat.setDownloadFaviconsEnabled(myWebView.settings, false) }
Java
// In this example, "myWebView" is an instance of WebView. if (WebViewFeature.isFeatureSupported(WebViewFeature.DOWNLOAD_FAVICONS_ENABLED)) { WebSettingsCompat.setDownloadFaviconsEnabled(myWebView.getSettings(), false); }
- 保存された状態を管理し、トランザクションの上限を回避します。
saveState(Bundle)を使用してライフサイクル イベント中にWebViewの状態を保存する場合は、WebViewCompat.saveState()を使用してペイロード サイズの上限を適用し、Android の 1 MB のsavedInstanceState上限を超えないようにします。詳しくは、WebView の状態を効率的に管理するをご覧ください。 - 投機的読み込み API を使用して、ネットワーク接続とページの読み込みを最適化します。ナビゲーションのレイテンシを短縮するには、Jetpack Webkit API を使用して、ネットワーク接続とコンテンツを事前に準備します。
Profile.addQuicHintsを呼び出して、QUIC 経由の HTTP/3 のサポートを事前に入力し、WebView が最初の接続で QUIC をすぐに使用できるようにします。また、Profile.preconnectを使用して、ネットワーク ソケットを事前にウォームアップします。リンク先の URL がわかっている場合や、リンク先の URL がわかっている可能性が高い場合は、Profile.prefetchUrlAsyncまたはWebViewCompat.prerenderUrlAsyncを使用して、バックグラウンドでページをフェッチまたはレンダリングします。詳しくは、WebView での投機的読み込みをご覧ください。 - ファビコンの自動ダウンロードが不要な場合は無効にします。
デフォルトでは、ナビゲーション時にサイトにアクセスするたびに、
WebViewがファビコンを自動的にダウンロードします。WebViewは、ダウンロードした各ファビコンのコピーを 2 つ(Java とネイティブ メモリに 1 つずつ)保持するため、ファビコンのダウンロードを無効にすると、メモリ(WebViewインスタンスあたり約 8 KB)を節約し、帯域幅の使用量を削減できます。アプリでファビコンを使用または表示しない場合は、Jetpack Webkit ライブラリのWebSettingsCompat.setDownloadFaviconsEnabled()を使用して自動ダウンロードを無効にします。Kotlin
// In this example, "myWebView" is an instance of WebView. if (WebViewFeature.isFeatureSupported(WebViewFeature.DOWNLOAD_FAVICONS_ENABLED)) { WebSettingsCompat.setDownloadFaviconsEnabled(myWebView.settings, false) }
Java
// In this example, "myWebView" is an instance of WebView. if (WebViewFeature.isFeatureSupported(WebViewFeature.DOWNLOAD_FAVICONS_ENABLED)) { WebSettingsCompat.setDownloadFaviconsEnabled(myWebView.getSettings(), false); }
- 保存された状態を管理し、トランザクションの上限を回避します。
saveState(Bundle)を使用してライフサイクル イベント中にWebViewの状態を保存する場合は、WebViewCompat.saveState()を使用してペイロード サイズの上限を適用し、Android の 1 MB のsavedInstanceState上限を超えないようにします。詳しくは、WebView の状態を効率的に管理するをご覧ください。
参考情報
- WebView での投機的読み込み
- WebView の状態を効率的に管理する
- WebView の Pixel-Perfect UI
- レスポンシブ デザインを学ぶ
- 可変ピクセル密度の高 DPI 画像
- モバイルウェブのベスト プラクティス
- ウェブを高速化する