【Kotlin/Android】ディープリンクの実装方法!URLからアプリの起動
この記事からわかること
- Kotlin/Androidアプリでディープリンクを実装する方法
- Webサイトからアプリを起動させるには?
- アプリAからアプリBを起動させる方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Narwhal Feature Drop
- Kotlin:2.0.21
- AGP:8.12.3
- gradle:8.13
ディープリンク
「ディープリンク」とはアプリを直接起動させることができるリンクのことです。これを使用することでアプリを起動させるだけでなく、特定の画面を開いた状態で起動させたりデータのやり取りなどを行うことも可能です。
Androidのディープリンク機能では固有のスキーム(例:my-test-app://)を設定することで対象のアプリを開くことができるようになります。逆にアプリが未インストールの場合はディープリンクを開いても何も起こりません。
またURL形式なのでクエリ情報などを付与することで特定のデータの受け渡しなども可能になります。
AppLinks(アプリリンク)との違い
同じようなディープリンクにAppLinks(アプリリンク)があります。これは独自で設定した固有のスキーム(例:my-test-app://)を使用してアプリを起動させることができます。概ねやっていることは同じですが、細かい挙動に差があります。
| ディープリンク | AppLinks | |
|---|---|---|
| スキーム | 任意のスキーム | HTTPS |
| アプリ未インストール時の挙動 | 動作しない | Webページを開く |
| 競合のリスク | スキームが被ると動作しない | なし |
| セキュリティ | 低い(誰でも同名スキームを作成できる) | 高い(ドメイン所有証明済み) |
| 実装方法 | アプリで完結 | サーバーへの設置も必要 |
またこれらの仕組みはiOSでも同じような仕組みが存在します。
| Android | iOS |
|---|---|
| AppLinks | ユニバーサルリンク |
| ディープリンク | Custom URL Scheme |
ディープリンクの実装方法
公式リファレンス:アプリ コンテンツ用のディープリンクを作成する
ディープリンク機能の実装は簡単で「AndroidManifest.xml」に適切な設定を追加するだけです。リンクで開きたいアプリ側のactivityのintent-filterに以下を追加します。
<activity
android:name=".View.Activity.MainActivity" />
<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="apps"
android:host="minnanotanjyoubi.com"
android:pathPattern="/hoge/.*" />
</intent-filter>
</activity>
肝となるのはdataの中の設定値です。
- scheme:URLのスキーム部分。例:apps、myapp、など自由に設定可能 httpsでもOK
- host:URLのホスト(ドメイン)部分。アプリ名とかにしておくとわかりやすいかも
- pathPattern:パス情報。Activityごとに違う値を入れたりなど
上記のように設定することでapps://minnanotanjyoubi.com/hoge/でアクセスした場合にアプリがあれば起動させることが可能になります。ただブラウザにそのまま貼り付けても動作しないようなので注意してください。
アプリが既に起動中の場合にリフレッシュされないようにする
アプリが既に起動済みの場合は毎回新しいアクティビティが作成される可能性があります。これを防ぐにはandroid:launchMode="singleTask"を追加しておくことで既存の MainActivityがあれば再利用されるようになります。
<activity
android:name=".View.Activity.MainActivity"
android:launchMode="singleTask" />
ディープリンクで起動した場合のコントロール
ディープリンクでアプリが起動した場合はonCreateなどのintent?.dataからUri型でURLを取得できるのでその値に応じてハンドリングしてあげればOKです。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val uri: Uri? = intent?.data
if (uri != null) {
// "/hoge/123" など
val path = uri.path
// "name=example" など
val queryParams = uri.query
// よしなにハンドリング
} else {
// ディープリンクが無効な場合は終了
}
}
アプリAから別のアプリBを起動する
ディープリンクを使用することでアプリAから別のアプリBを起動することも可能です。起動させるにはIntentの引数にACTION_VIEWを指定して、Uri.parseに対象のディープリンクを指定すればOKです。もし存在しないリンクを指定されている場合はActivityNotFoundExceptionが投げられるのでキャッチしてハンドリングすればOKです。
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("apps://minnanotanjyoubi.com/hoge/"))
try {
startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Google Play Storeなどに遷移させるなど
val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://appdev-room.com/"))
startActivity(webIntent)
}
アプリAからアプリAのディープリンクを利用する
アプリAの中からアプリAのディープリンクを利用することも一応可能ではあります。これは例えばFirebaseなどのモーダルやメッセージ表示を行っている際にそこのタップイベントでディープリンクを仕込みたい場合などです。実装方法に特に差分はなくアプリAのなかでアプリAを開くようにしてあげればOKです。
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("apps://minnanotanjyoubi.com/hoge/"))
try {
startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Google Play Storeなどに遷移させるなど
val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://appdev-room.com/"))
startActivity(webIntent)
}
ただ呼び出された時にアプリ自体が再度1から立ち上がる(最初の画面から表示された)ので元の画面まで遷移させるなどハンドリングをしてあげた方が良さそうです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。






