Android 上の WebAPK

ユーザーが Android のホーム画面にプログレッシブ ウェブアプリを追加すると、Chrome によって APK(WebAPK と呼ばれることもあります)が自動的に生成されます。APK 経由でインストールすると、アプリをアプリ ランチャーや Android のアプリ設定に表示したり、一連のインテント フィルタを登録したりできます。

Android で PWA をインストールすると、ユーザーのホーム画面にプログレッシブ ウェブアプリを追加するだけではありません。Chrome は、アプリの特別な APK を自動的に生成してインストールします。これを WebAPK と呼ぶこともあります。APK 経由でインストールすると、アプリをアプリ ランチャーや Android のアプリ設定に表示したり、一連のインテント フィルタを登録したりできます。

WebAPK を生成するために、Chrome は ウェブアプリ マニフェストなどのメタデータを参照します。マニフェストの更新が検出されると、Chrome は新しい APK を生成する必要があります。

Android インテント フィルタ

プログレッシブ ウェブアプリが Android にインストールされると、アプリのスコープ内のすべての URL に対して一連のインテント フィルタが登録されます。ユーザーがアプリのスコープ内のリンクをクリックすると、ブラウザのタブではなくアプリが開きます。

次の部分的な manifest.json について考えてみましょう。

"start_url": "/",
"display": "standalone",

これを使用しているウェブアプリをアプリ ランチャーから起動すると、https://example.com/ がブラウザ クロムなしのスタンドアロン アプリとして開きます。

WebAPK には次のインテント フィルタが含まれます。

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data
    android:scheme="https"
    android:host="example.com"
    android:pathPrefix="/" />
</intent-filter>

ユーザーがインストール済みのアプリ内のリンクをクリックして https://example.com/read に移動すると、そのリンクはインテントによってキャッチされ、Progressive Web App で開かれます。

scope を使用してインテント フィルタを制限する

プログレッシブ ウェブアプリでサイト内のすべての URL を処理しないようにするには、ウェブアプリ マニフェストに scope プロパティを追加します。scope プロパティは、URL が origin + scope と一致する場合にのみウェブアプリを開くように Android に指示します。これにより、アプリで処理する URL とブラウザで開く URL を制御できます。これは、アプリとアプリ以外のコンテンツが同じドメインにある場合に便利です。

次の部分的な manifest.json について考えてみましょう。

"scope": "/app/",
"start_url": "/app/",
"display": "standalone",

アプリ ランチャーから起動すると、https://example.com/app/ はブラウザ Chrome なしでスタンドアロン アプリとして開きます。

生成された WebAPK には、前回と同様にインテント フィルタが含まれますが、APK の AndroidManifest.xml に異なる android:pathPrefix 属性が含まれます。

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data
    android:scheme="https"
    android:host="example.com"
    android:pathPrefix="/app/" />
</intent-filter>

例をいくつか見てみましょう。

すべきこと

https://example.com/app/ - /app/

すべきこと

https://example.com/app/read/book - /app/

すべきでないこと

https://example.com/help/ - /app/ に含まれない

すべきでないこと

https://example.com/about/ - /app/ に含まれない

scope の詳細、設定しなかった場合の影響、アプリのスコープの定義に使用する方法については、scope をご覧ください。

権限の管理

権限は他のウェブアプリと同じように機能し、インストール時にリクエストすることはできません。代わりに、実行時にリクエストする必要があります。理想的には、本当に必要な場合にのみリクエストします。たとえば、初回読み込み時にカメラの権限をリクエストするのではなく、ユーザーが写真を撮ろうとするまで待つようにします。

ストレージとアプリの状態の管理

プログレッシブ ウェブアプリが APK 経由でインストールされている場合でも、Chrome は現在のプロファイルを使用してデータを保存するため、分離されません。これにより、ブラウザとインストール済みアプリ間でエクスペリエンスを共有できます。Cookie は共有され、アクティブになります。すべてのクライアントサイド ストレージにアクセスでき、サービス ワーカーがインストールされ、すぐに使用できるようになります。

WebAPK の更新

WebAPK の更新方法に関する情報は、Chrome でウェブアプリ マニフェストの更新を処理する方法に移動しました。

よくある質問

スプラッシュ画面の生成に使用されるアイコンはどれですか?:
スプラッシュ画面には、少なくとも 2 つのアイコン(192 ピクセル、512 ピクセル)を用意することをおすすめします。スプラッシュ画面のアイコンが小さすぎるというご意見を多数いただきました。Chrome 71 以降で生成された WebAPK では、スプラッシュ画面に大きなアイコンが表示されます。推奨アイコンが提供されている限り、対応は必要ありません。
ユーザーがサイトのネイティブ アプリをすでにインストールしている場合はどうなりますか?
現在提供されている「ホーム画面に追加」機能と同様に、ユーザーはネイティブ アプリに依存しないサイトを追加できるようになります。ユーザーが両方をインストールする可能性がある場合は、サイトのアイコンや名前をネイティブ アプリと区別することをおすすめします。
ユーザーが Chrome のキャッシュを消去すると、インストール済みのサイトのストレージも消去されますか?
はい。
新しいデバイスに切り替えると、アプリは再インストールされますか?
現時点ではできませんが、重要な機能であると考えており、実現に向けて調査を進めています。
権限はどのように処理されますか?Chrome のプロンプトが表示されますか、それとも Android のプロンプトが表示されますか?
権限は引き続き Chrome で管理されます。ユーザーには、権限を付与するための Chrome プロンプトが表示され、Chrome の設定で権限を編集できるようになります。
この機能はどのバージョンの Android で利用できますか?
プログレッシブ ウェブアプリは、Chrome for Android を搭載したすべてのバージョンの Android(特に Jelly Bean 以降)にインストールできます。
WebView は使用されますか?
いいえ。サイトは、ユーザーがサイトを追加したバージョンの Chrome で開きます。
作成した APK を Google Play ストアにアップロードできますか?
いいえ。独自の APK をアップロードする場合は、信頼できるウェブ アクティビティをご覧ください。
これらのアプリは Google Play ストアに登録されていますか?
いいえ。Google Play ストアに掲載する独自の APK をアップロードする場合は、信頼できるウェブ アクティビティをご覧ください。
Android 版の別のブラウザのデベロッパーですが、このシームレスなインストール プロセスを利用できますか?:
現在、解決に向けて取り組んでおります。Google は、Android のすべてのブラウザでこの機能を利用できるように取り組んでおります。詳細については、近日中にお知らせいたします。