さまざまなコンポーネントを使用して Android アプリ内でウェブ コンテンツをレンダリングする方法。
Android プラットフォームは 10 年以上前から存在し、初期の頃からウェブを十分にサポートしてきました。WebView が同梱されています。WebView は、デベロッパーが独自の Android アプリ内でウェブを使用できるようにするコンポーネントです。さらに、Android では、デベロッパーが独自のブラウザ エンジンをプラットフォームに導入できるため、競争とイノベーションが促進されます。
デベロッパーは、さまざまな方法で Android アプリにウェブを組み込むことができます。WebView は、広告のレンダリング、Android UI 要素とともに使用されるレイアウト コンポーネント、HTML 5 ゲームのパッケージ化によく使用されます。カスタムタブを使用すると、デベロッパーはアプリ内ブラウザを構築し、サードパーティのウェブ コンテンツへのシームレスなナビゲーション エクスペリエンスを提供できます。信頼できるウェブ アクティビティを使用すると、デベロッパーは Android アプリでプログレッシブ ウェブアプリ(PWA)を使用できます。PWA は Google Play ストアからダウンロードできます。
Android WebView
WebView を使用すると、デベロッパーは Android アプリ内で最新の HTML、CSS、JavaScript にアクセスできます。また、コンテンツを APK 内に出荷したり、インターネットでホストしたりできます。Android で最も柔軟で強力なコンポーネントの 1 つであり、Android アプリにウェブ コンテンツが含まれているほとんどのユースケースで使用できます。AdMob などの広告サービスを強化することから、WebGL などの最新の API を使用する完全な HTML5 ゲームの構築と配信まで、幅広く活用できます。
ただし、WebView をアプリ内ブラウザの作成や Android アプリへの PWA の組み込みに使用する場合、WebView にはウェブ プラットフォームのセキュリティ、機能、機能が欠けています。
アプリ内ブラウザの課題
サードパーティのウェブサイトにアクセスする際にユーザーによりシームレスなエクスペリエンスを提供することを目的として、サードパーティのコンテンツを Android アプリに組み込んでブラウザ エクスペリエンスを構築するデベロッパーが増えています。こうした機能はアプリ内ブラウザとして知られるようになりました。
WebView は、最新のウェブ技術スタックを幅広くサポートしており、WebGL などの最新のウェブ API をサポートしています。ただし、WebView は主にウェブ UI ツールキットです。ウェブ プラットフォームのすべての機能をサポートすることを目的としていないため、サポートもされていません。API にすでに OS レベルの代替手段(Web Bluetooth など)がある場合や、プッシュ通知などブラウザ UI の実装が必要な場合、サポートされていない可能性があります。ウェブ プラットフォームが進化し、Android アプリでのみ利用可能だった機能が追加されるにつれて、この差はさらに大きくなります。アプリ デベロッパーは、サードパーティ コンテンツを開く際に使用される機能を制御できないため、WebView はアプリ内ブラウザやプログレッシブ ウェブアプリを開くには適していません。WebView ですべてのウェブ プラットフォーム機能をサポートしても、デベロッパーは権限やプッシュ通知などの機能に独自の UI を実装してコードを記述する必要があり、ユーザーにとって一貫した操作を実現することが難しくなります。
WebView をアプリ内ブラウザとして使用する際のセキュリティ上の考慮事項
WebView を使用すると、埋め込みアプリケーションは、Cookie や DOM など、レンダリングされたコンテンツに完全にアクセスできます。これらは強力な機能であり、ユーザーからの高い信頼を必要とします。
WebView はブラウザを構築するためのフレームワークを目的としていないため、最新のブラウザで利用可能なセキュリティ機能がありません。
マルチプロセス アーキテクチャとサイト分離
ブラウザは、信頼できないコンテンツをレンダリングして実行する際に安全性を確保するように設計されています。信頼できない、または悪意のある可能性のあるコンテンツを操作する際にユーザーの安全を確保するため、最新のブラウザでは、マルチプロセス アーキテクチャやサイト分離などの手法が採用されています。
マルチプロセス アーキテクチャがないと、ウェブページが原因でブラウザ アプリ全体がクラッシュしたり、脆弱性が悪用されてデバイス全体が制御されたりする可能性があります。サイト分離は、信頼できないサイトが他のサイトから情報にアクセスして盗み出すことを困難にする、セキュリティのもう 1 つのレイヤを追加します。
Android 8.0 Oreo までは、WebView レンダラは埋め込みアプリケーションと同じプロセスを使用していました。新しいバージョンの OS で、デバイスが十分な能力を持っている場合、レンダラは別のプロセスで実行されます。ただし、1 つのプロセスがすべてのページとそれらを実行する WebView インスタンス間で共有されるため、サイト分離を完全に実装することはできません。
マルチプロセス アーキテクチャとサイト分離がないこと自体は、所有し信頼できるコンテンツをレンダリングするアプリでは問題になりませんが、信頼できないサードパーティ コンテンツを実行するアプリ(アプリ内ブラウザなど)では問題になる可能性があります。また、ユーザーは Meltdown や Spectre などの脆弱性にさらされることになります。これらの脆弱性は、Cookie、銀行口座情報、個人情報などの盗難に使用される可能性があります。
セキュア UI インジケーター
また、ユーザーに適切なセキュリティ インジケーターを提供することも重要です。ブラウザはこの分野に多くの労力を注ぎ、常に進化しています。ただし、WebView には、サイトの接続が安全かどうかを確認する API がないため、アプリケーション デベロッパーが信頼できるセキュリティ インジケーターを構築することはできません。このような API がないと、たとえば、安全な HTTPS 接続であっても、アドレスバーに表示される URL がユーザーに表示されるページと一致しない可能性があります。
デベロッパーが利用できるもう 1 つの方法は、ブラウザ エンジンをアプリに埋め込むことです。このアプローチは、アプリケーションのサイズが増加するだけでなく、複雑で時間もかかります。
アプリ内ブラウザのソリューションとしてのカスタムタブ
カスタムタブは Chrome 45 で導入されました。これにより、デベロッパーはユーザーのデフォルト ブラウザのタブをアプリの一部として使用できるようになりました。カスタムタブはもともと Chrome によってリリースされたため、「Chrome カスタムタブ」と呼ばれていました。現在は Android API であり、Chrome、Firefox、Edge、Samsung Internet など、ほとんどの一般的なブラウザがカスタムタブをサポートしているため、「カスタムタブ」と呼ぶのが適切です。
カスタムタブを使用すると、デベロッパーはウェブ コンテンツをアプリにシームレスに統合できます。また、デベロッパーは、ツールバーの色、アクション ボタン、遷移アニメーションなどをカスタマイズして、ウェブ コンテンツを表示するアクティビティをカスタマイズすることもできます。
また、WebView の使用時やブラウザ エンジンの埋め込み時に利用できなかった機能も提供されます。アプリ内ブラウザはユーザーのブラウザをベースとしているため、カスタムタブはブラウザとストレージを共有します。そのため、インストール済みのアプリのいずれかがアプリ内ブラウジング セッションを開始するたびに、お気に入りのウェブサイトに再ログインする必要はありません。
WebView とは異なり、カスタムタブは、それを動かすブラウザでサポートされているすべてのウェブ プラットフォームの機能と API をサポートしています。
Trusted Web Activity を使用してプログレッシブ ウェブアプリを開く
プログレッシブ ウェブアプリは、かつてはプラットフォーム固有のアプリでしか利用できなかった多くの動作や機能をウェブにもたらします。アプリのような動作が導入されたことで、デベロッパーは Android でこうしたエクスペリエンスを再利用したいと考えるようになり、PWA をアプリに統合する方法を求めるようになりました。
カスタムタブは、最新のウェブ機能と API をすべてサポートしていますが、主にサードパーティのコンテンツを開くように設計されているため、上部に、アクセスしている URL をユーザーに示すツールバーと、サイトが安全かどうかを示すロックアイコンがあります。アプリ独自のエクスペリエンスを開くときに、ツールバーを使用すると、アプリがオペレーティング システムと統合されているように見えなくなります。
Trusted Web Activities は Chrome 72 で導入され、デベロッパーが Android アプリ内で PWA を使用できるようにします。プロトコルはカスタムタブ プロトコルに似ていますが、デベロッパーが(デジタル アセット リンクを介して)Android アプリと開いている URL の両方を制御していることを確認し、両方が true の場合に URL バーを削除できる API が導入されています。
また、PWA を開くときにスプラッシュ画面を作成したり、ウェブ通知を Android コードで処理するように委任したりするための API も導入されました。Google Play 請求サービスのサポートなど、その他の機能も近日提供予定です。
Trusted Web Activity で開く URL は PWA であり、一連の動作とパフォーマンス特性を持つことが想定されるため、Trusted Web Activity では、その内部で開く PWA の品質基準が導入されています。
現在のソリューションの制限事項
デベロッパーからのフィードバックでは、カスタムタブのプラットフォーム互換性と WebView の柔軟性を組み合わせて、アプリ内ブラウザに DOM へのアクセスや JavaScript のインジェクションを可能にすることが必要とされています。
Custom Tabs は、カスタム UI または UI なしでユーザーのブラウザによってレンダリングされるタブです。つまり、ブラウザはブラウザに対するプライバシーとセキュリティに関するユーザーの期待に応える必要があるため、そうした機能の一部は不可能になります。
Google の Android 向けウェブ チームは、これらのユースケースを解決するための代替手段を調査し、ソリューションをテストしています。詳細は随時お知らせします。
概要
WebView は、Android アプリ内で HTML、CSS、JavaScript が必要なものの、プッシュ通知やウェブ Bluetooth など、最新のウェブで利用可能な高度な機能や機能を使用しない場合に便利です。モダン ウェブ プラットフォーム向けに設計されたコンテンツを開く場合は、デベロッパーが意図した方法で表示されない可能性があるため、推奨されません。WebView は、アプリ内ブラウザの作成にはおすすめしません。一方、ファーストパーティのウェブ コンテンツを表示する場合は、WebView が真価を発揮します。
Trusted Web Activity は、デベロッパーが独自のプログレッシブ ウェブアプリを Android アプリ内で全画面表示する場合に使用する必要があります。アプリ内の唯一のアクティビティとして使用することも、他の Android アクティビティとともに使用することもできます。
ウェブ プラットフォーム用に設計されたサードパーティ コンテンツ(アプリ内ブラウザ)を開くには、カスタムタブを使用することをおすすめします。