【Kotlin/Android】ディープリンクの実装方法!URLからアプリの起動

この記事からわかること
- Kotlin/Androidアプリでディープリンクを実装する方法
- Webサイトからアプリを起動させるには?
- アプリAからアプリBを起動させる方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Koala
- Kotlin:1.9.0
ディープリンク
「ディープリンク」とはアプリを直接起動させることができるリンクのことです。これを使用することでアプリを起動させるだけでなく、特定の画面を開いた状態で起動させたりデータのやり取りなどを行うことも可能です。
Androidのディープリンク機能では固有のスキーム(例:my-test-app://
)を設定することで対象のアプリを開くことができるようになります。逆にアプリが未インストールの場合はディープリンクを開いても何も起こりません。
またURL形式なのでクエリ情報などを付与することで特定のデータの受け渡しなども可能になります。
iOSでは「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 data: Uri? = intent?.data
if (data != 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)
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。