Android 12 からの web intent

Android 12 から web intent の解決方法が変更され、ブラウザで開くというのがデフォルトの動作になりました。
targetSdkVersion に関わらず影響のある変更です。

developer.android.com

Web Intent

web intent は以下の条件を満たす intent です。

  • アクション: ACTION_VIEW
  • カテゴリ: CATEGORY_DEFAULT
    • Android 12 以降は CATEGORY_BROWSABLE の宣言も必要
  • スキーム: http または https
  • ホスト: domain.tld 形式

Android 12 未満では、 AndroidManifest.xml で上記に対応した intent-filter を設定すると、任意の URL をアプリで開くことができます。

<!-- ブラウザ等で https://example.com にアクセスすると ExampleActivity が開く -->
 
<activity android:name=".ExampleActivity" ... >
    <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" />
    </intent-filter>
</activity>

これを使って例えばブラウザや SNS から自分のアプリへ誘導することができます。

Android 12 以降、デフォルトでは上記設定をしても https://example.com はブラウザで開かれます(アプリで開かれません)。
アプリで開くようにする方法は 2つです。

  • Android AppLinks に対応する
  • ユーザに、設定アプリでドメインとアプリの関連付けを行ってもらう

AppLinks

Android アプリでリンクを扱う仕組みは DeepLink と言います。
そのうち上記 web intent を扱う仕組みを WebLinks、さらにその中にあるのが Android AppLinks の仕組みです。

f:id:takorras:20211108120722p:plain:w250
日本語ドキュメントにはこの図がなかった...

DeepLink と Android AppLinks の違いは以下の通りです。

f:id:takorras:20211106140219p:plain

AppLinks の特徴は以下です。

  • より安全で具体的
    • ドメインとアプリの関連付けが明確になるため
      • 許可するアプリ一覧を示した json ファイルを、ドメイン配下に置く
        • 指定のない外部アプリは、そのドメインに対するリンクを開けなくなる(ただユーザが設定すれば変更可能だと思われる)
  • よりスムーズ
    • アプリチューザを表示することなくアプリを開くため
      • DeepLink では、リンクを解決可能なアプリが複数あった場合チューザが表示され、ユーザが選択する必要がある

AppLinks を有効にする手順は 2つです。

  • 対象の intent-filter に android:autoVerify="true" を追加する
  • Digital Asset Links json ファイルをホスティングする

Digital Asset Links json ファイルに許可したいアプリ id とその署名証明書のフィンガープリントを記録し、対象ドメインに配置することで、 google がアプリとドメインの関連付けを確認できるようになります。
autoVerify 属性を true にすると、 Android OS が実際に確認してくれます。

json は以下を参考に作成し、
https://[対象ドメイン]/.well-known/assetlinks.json で公開します。 developer.android.com

参考に、 google.com の Digital Asset Links Json ファイルを以下から確認できます。 https://www.google.com/.well-known/assetlinks.json

ユーザに設定からドメインとアプリを紐付けてもらう

AppLinks を使わない場合、こちらで対応できます。
ユーザを設定画面に誘導し、あるドメインへのリンクを開くことを許可してもらいます。

developer.android.com

テストする

developer.android.com

最後に

Android 12 のドキュメントではアプリチューザを省いて UX を簡素化するためとあります。
ただこれまでは任意のアプリが任意の URL を処理できていたので、セキュリティや安全性の観点もありそうです。

当然ですが AppLinks は対象ドメインとアプリを管理している必要があるので(jsonホスティングする必要がある)、サードパーティのクライアントアプリ等にはかなり厳しい変更かもしれません。

許可設定を上手に誘導するのは大変ですし、両方管理している場合は迷わず AppLinks を採用することになりそうです。

資料

developer.android.com