この記事では、先日 Medium に公開された Maximiliano Firtman 氏による記事『Google Play Store now open for Progressive Web Apps 😱』を要約して感想などを加えています。
記事のタイトルを訳すと『Google Play ストアで PWA を配信できるようになった 😱』という感じでしょうか。Web エンジニアとしては惹かれるタイトルですよね。ただ私は Android 事情には疎いですし、結局どういうことなのか?記事を読んでまとめてみようと思いました。
まとめると
- Android 向け Chrome のバージョン72から Trusted Web Activity が実装された。
- ネイティブアプリ内で Web アプリを起動する新しい仕組み。WebView など既存の同種の仕組みの欠点を補っている。よりネイティブと Web の体験の境界が薄くなった。
- まだドキュメントも整っておらず、実装上・機能上の制約もあるが、将来に期待。
Trusted Web Activity
Trusted Web Activity とは、ネイティブアプリ内で Web コンテンツを起動する仕組みです。
Google の中の人が Trusted Web Activity を説明する動画。
他の方法との比較
今までも Play ストアで PWA を配信する方法、すなわち Web コンテンツを含んだ Android アプリを作成する方法はありました。WebView と Chrome Custom Tabs です。
たとえば Play ストアですでに公開されている PWA である Instagram Lite や Twitter Lite は WebView だそうです。
個人的には WebView は聞いたことがありました。Cordova などのいわゆる「ハイブリッドアプリ」ですよね。Chrome Custom Tabs は初めて知りました。自前のアプリから端末内の Chrome(ユーザーが普段使う Chrome)を立ち上げる機能だそうです。WebView は独自のブラウザ機能で Web コンテンツをレンダリングするので、その点が違うのですね。
そして、それから最近リリースされた Chrome の機能が Trusted Web Activity です。過去の2通りの方法にはそれぞれ良い点もあれば悪い点もあって、Trusted Web Activity はそれらの悪い点を補っているとのことです。
動画や元記事で紹介されている WebView、Chrome Custom Tabs、Trusted Web Activity のそれぞれの特徴を以下にまとめました。
WebView
- :上部に Chrome のツールバーなどが出てこない(見た目がネイティブっぽい)
- :ネイティブコードと Web アプリの間でデータのやりとりができる
- :Web とネイティブアプリでクッキーやキャッシュなどを共有できない
- :ブラウザ自体が最新版ではないかもしれない
Chrome Custom Tabs
- :クッキーやキャッシュなどを共有できる
- :ブラウザが最新版である可能性が高い(端末内の Chrome を使うため)
- :上部に Chrome のツールバーなどが出てしまう(ネイティブっぽくない)
Trusted Web Activity
- :クッキーやキャッシュを共有できる
- :ブラウザが最新版である可能性が高い
- :上部に Chrome のツールバーなどが出てこない
大きくまとめると、
- WebView と Trusted Web Activity は上部に Chrome のツールバーなどが出てこないのでネイティブっぽい見た目を提供できる。
- Chrome Custom Tabs と Trusted Web Activity はレンダリングに端末内の Chrome を使うので、ネイティブアプリと PWA の間でクッキーやキャッシュを共有できる。
という感じでしょうか。
余談ですが個人的にセッションの共有は面白いと思いました。たとえば Web でログインしたらモバイルアプリでアクセスしてもログイン状態になるということですよね。
また先ほど WebView で実装されたストア内 PWA の例として紹介した Instagram Lite や Twitter Lite は、通知などのネイティブ機能を実現するためにたくさんのネイティブ向けコードを追加しているんだとか。Trusted Web Activity ではネイティブアプリと Web アプリの間のコミュニケーションチャネルが実装されていて、たとえば Web アプリへのプッシュ通知がネイティブの通知として端末に表示されるそうです。
ただし出たばかりの仕組みですから良い点ばかりではありません。制約は後述します。
Trusted Web Activity の仕組み
Trusted Web Activity は Digital Assets Links という電子認証の仕組みを用いています。ネイティブアプリと Web サーバの間で電子認証を行って、アプリの配信者が PWA の所有者であること、他者の所有する PWA を配信していないことを証明するのですね。
ざっくりいうと、アプリの配信用パッケージを作成する際に生成するハッシュを、PWA をホスティングする Web サーバにも格納しておくことでアプリの配信者と PWA の開発者が同一人物であることを証明する仕組みのようです。
Chrome Custom Tabs の場合は単にアプリ内で URL を(端末内の Chrome を使って)開くだけですから、認証を要する Trusted Web Activity の方がより本格的に Web コンテンツを自前のネイティブアプリの一部として扱う技術と言えそうです。
どうやって作るの?
Trusted Web Activity を利用したアプリの開発はまだ初期段階で、ドキュメントなども揃ってはいないようです。こちらのサンプルアプリなどを参考に作ってみるしかなさそうです。
開発方法は2つあります。
- Chrome 開発チームが提供するサポートライブラリを使用する方法。この場合は Java や Kotlin のコードを書く必要はありません。Android Studio からプロジェクトを作って AndroidManifest.xml に必要な設定を書けばOKらしいです。
- Trusted Web Activity を扱うコードを自分でゴリゴリ書く方法。
Web エンジニア的には前者が圧倒的に現実的ですね。今後もっと環境が整備されることを期待しましょう。
制約はあるの?
Trusted Web Activity は出たての機能ですから、まだまだ制約も多いようです。
プライベートなアプリはNG
パブリックなドメインとの間で認証を行う Digital Asset Link の仕様上、イントラネット環境でしか認識されない URL で動作する PWA などはアプリ化できません。
初期表示
HTML、JS、CSS などのリソースは Service Worker から(ブラウザのバックグラウンドで)ダウンロードされます。一度リソースをダウンロードしてしまえばキャッシュできますが、インストールして初めてアプリを開いたときに仮にオフラインだと、何も表示できず真っ白な画面になってしまいます。
ネイティブ機能
PWA から呼び出せるデバイスのネイティブ機能はプッシュ通知のみです。ゴリゴリやればやれないことはないとのこと。でもそれだと PWA で書く嬉しさはなくなりますね。
課金
Play ストアでのマネタイズはまだ難しいようです。有料アプリだとしても結局内容はパブリックな URL がついた Web アプリなので、実際に料金を支払ったかどうか判別するのは困難とのこと。アプリ内課金についてもケータイ料金に紐づけるような課金方法の実装は「チャレンジ」だと元記事には書いてあります。
そもそも Chrome が入ってなかったら…
Trusted Web Activity は端末にインストールされた Chrome を利用します。端末の Chrome が対応していない古いバージョンであったり、もしくは Chrome 自体が端末に入っていなかっったらどうなるのでしょうか?
端末の Chrome が Trusted Web Activity をサポートしていない古いバージョンであれば普通に Web アプリとして起動するようです。
しかし端末に Chrome がインストールされていなかったら、今のところサポートライブラリを使って開発する場合は対応策はなく、アプリは動かないそうです。自分で Trusted Web Activity API を使ってゴリゴリ書く場合はなんらかの判定処理は書けるだろうとのこと。
元記事は後半はサンプル PWA アプリを Github からダウンロードしてきて、配信可能なパッケージに固めるところまで行うチュートリアルが続くのですが、ここらへんは私自身も試してみてからまた記事にしたいと思います。
感想
Google Play ストアが PWA の配信に対応した!ということではなくて、Android アプリに Web アプリを内包するための機能が Chrome に増えたよ、という話だったようですね。
ただ調べた限りではいままでよりももっと「Web アプリをそのままネイティブアプリとして配信できる世界」に近づいた印象でした。
まだまだ制約はあるようですが、なんとかしようと頑張ると PWA で作れる嬉しさはなくなって、Android エンジニア呼んで Java でネイティブアプリ書いたほうが早いじゃんとなってしまいますね。今のところは制約を許容できるケースでチャレンジするのが良さそうです。
とりあえず個人では何か作って配信してみたくなりますね