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

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

この記事からわかること

  • Kotlin/Androidアプリディープリンク実装する方法
  • Webサイトからアプリを起動させるには?
  • アプリAからアプリBを起動させる方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

ディープリンク

ディープリンク」とはアプリを直接起動させることができるリンクのことです。これを使用することでアプリを起動させるだけでなく、特定の画面を開いた状態で起動させたりデータのやり取りなどを行うことも可能です。

Androidのディープリンク機能では固有のスキーム(例:my-test-app://)を設定することで対象のアプリを開くことができるようになります。逆にアプリが未インストールの場合はディープリンクを開いても何も起こりません

またURL形式なのでクエリ情報などを付与することで特定のデータの受け渡しなども可能になります。

AppLinks(アプリリンク)との違い

同じようなディープリンクにAppLinks(アプリリンク)があります。これは独自で設定した固有のスキーム(例:my-test-app://)を使用してアプリを起動させることができます。概ねやっていることは同じですが、細かい挙動に差があります。

ディープリンク AppLinks
スキーム 任意のスキーム HTTPS
アプリ未インストール時の挙動 動作しない Webページを開く
競合のリスク スキームが被ると動作しない なし
セキュリティ 低い(誰でも同名スキームを作成できる) 高い(ドメイン所有証明済み)
実装方法 アプリで完結 サーバーへの設置も必要

またこれらの仕組みはiOSでも同じような仕組みが存在します。

ディープリンクの実装方法

公式リファレンス:アプリ コンテンツ用のディープリンクを作成する

ディープリンク機能の実装は簡単で「AndroidManifest.xml」に適切な設定を追加するだけです。リンクで開きたいアプリ側のactivityintent-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の中の設定値です。

上記のように設定することで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から立ち上がる(最初の画面から表示された)ので元の画面まで遷移させるなどハンドリングをしてあげた方が良さそうです。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

Search Box

Sponsor

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index