Android 12 からの web intent
Android 12 から web intent の解決方法が変更され、ブラウザで開くというのがデフォルトの動作になりました。
targetSdkVersion に関わらず影響のある変更です。
Web Intent
web intent は以下の条件を満たす intent です。
- アクション:
ACTION_VIEW
- カテゴリ:
CATEGORY_DEFAULT
- Android 12 以降は
CATEGORY_BROWSABLE
の宣言も必要
- Android 12 以降は
- スキーム:
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つです。
AppLinks
Android アプリでリンクを扱う仕組みは DeepLink と言います。
そのうち上記 web intent を扱う仕組みを WebLinks、さらにその中にあるのが Android AppLinks の仕組みです。
DeepLink と Android AppLinks の違いは以下の通りです。
AppLinks の特徴は以下です。
- より安全で具体的
- よりスムーズ
- アプリチューザを表示することなくアプリを開くため
- DeepLink では、リンクを解決可能なアプリが複数あった場合チューザが表示され、ユーザが選択する必要がある
- アプリチューザを表示することなくアプリを開くため
AppLinks を有効にする手順は 2つです。
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 を使わない場合、こちらで対応できます。
ユーザを設定画面に誘導し、あるドメインへのリンクを開くことを許可してもらいます。
テストする
最後に
Android 12 のドキュメントではアプリチューザを省いて UX を簡素化するためとあります。
ただこれまでは任意のアプリが任意の URL を処理できていたので、セキュリティや安全性の観点もありそうです。
当然ですが AppLinks は対象ドメインとアプリを管理している必要があるので(json をホスティングする必要がある)、サードパーティのクライアントアプリ等にはかなり厳しい変更かもしれません。
許可設定を上手に誘導するのは大変ですし、両方管理している場合は迷わず AppLinks を採用することになりそうです。