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

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

この記事からわかること

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

index

[open]

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

みんなの誕生日

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

posted withアプリーチ

環境

ディープリンク

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

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

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

iOSでは「Custom URL Scheme」が同じような仕組みの機能になります。

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

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

ディープリンク機能の実装は簡単で「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 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)
}

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

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

searchbox

スポンサー

ProFile

ame

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

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

New Article

index