アプリリンクとディープリンクの違い

# 
なんとなくアプリリンクはディープリンクの上位互換ぐらいにしか思ってなかったのですが、どう使い分けるの？と質問された時に答えられなかったので整理してみました。
実装方法についても備忘録的に書いてます。

# アプリリンクとディープリンクの違い
機能や実装方法はほぼ一緒ですが、アプリリンクを設定すると操作する端末のOSバージョンによって挙動が少し変化します。

ブラウザからhrefタグで対象のURLにアクセスした場合のデフォルト時の挙動の違いは以下のようになります。
|  APIレベル | ディープリンク |アプリリンク |
| --- | --- | --- |
| 23(6.0)未満 | リンクを開く先の選択肢が表示される |アプリリンク使用不可（ディープリンクと同じ挙動)|
| 23(6.0)以上 | リンクを開く先の選択肢が表示される |アプリへ遷移する
| 31(12.0)以上 |ブラウザへ遷移する  |アプリへ遷移する

これらはあくまでもアプリをインストールした直後のデフォルトの挙動なので
アプリへの遷移を優先するかどうかはユーザーが任意に設定変更することが可能です。

# ディープリンクとは
Webブラウザやメールなどからの特定のURLのリダイレクトをアプリへと遷移させることが可能になる機能です。
URIの一般的な構文に従って自由に設定することができます。
```AndroidManifest.xml
        <activity
            android:name=".activity.TopActivity"  ...
             >
            <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="toroncho.com"
                    android:pathPattern="/hoge/.*" />
            </intent-filter>
       </activity>
```
上記の場合 https://toroncho.com/hoge/.* で表現される全てのリンクはアプリへと遷移します。
**android:scheme**には一般的なプロトコルであるhttp以外にも**app**や**fuga**など独自のスキームを設定することができ、その場合 fuga://toroncho.com/hoge/.*が有効なディープリンクとして機能します。

## ディープリンクの受け取り
上記したURLへのリダイレクトを受けた場合TopActivityが起動します。
アプリが起動していない状態でリダイレクトが発生した場合はTopActivityのonCreateでintentからデータを受け取ることができ、URIをコード内でハンドリングすることで、アプリ内の特定の画面や機能を呼び出すことが可能です。またURIにクエリを付与することで、より細かい操作が可能です。

```TopActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val data: Uri? = intent?.data
        val str: String? = intent?.dataString
        val type = uri.getQueryParameter("type")
        val id = uri.getQueryParameter("id")
 }
```
例えばhttps://toroncho.com/test?type=hoge&id=99 をTopActivityでハンドリングする場合上記のような実装になります。
この場合strにはhttps://toroncho.com/test?type=hoge&id=99 が入り
**type**にはhoge 
**id**には99が入ります。
Uri型はhttps://toroncho.com/test?type=hoge&id=99 をパースした情報を持った抽象クラスです。

TopActivityが既に起動している状態でリダイレクトが発生した場合はonNewIntentが呼ばれます
```TopActivity.kt
    override fun onNewIntent(intent: Intent?) {
        val data: Uri? = intent?.data
        super.onNewIntent(intent)
    }
```
intentの扱い方は同じですが、onCreateが呼ばれないため注意が必要です。

# アプリリンクとは
アプリリンクはAndroid6.0（APILevel23)で導入された機能です。
スキームにhttp, httpsが設定されたディープリンクのURLにアクセスした際、アプリへの遷移を優先するのが主な機能です。

## アプリリンクを有効にする
アプリ側の実装はintent-filterにautoVerify="true"を設定するだけです。
```AndroidManifest.xml
      <intent-filter android:autoVerify="true">
```
サーバー側にはディープリンクで設定したホストサーバーにDigital Asset Links JSONファイルを次の場所に配置する必要があります。
http://ドメイン名/.well-known/assetlinks.json

JSONファイルはAndroidStudioのDigital Asset Links File Generatorを使用して作成します。
[こちら](https://developer.android.com/studio/write/app-link-indexing?hl=ja)を参考にしてください。

## デフォルトで開くアプリの設定を変更する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355138/7132ed85-4bba-ac6c-250c-18fd64421170.png" width="50%">

対象アプリの設定画面からOpen by default を開きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355138/7ddf0207-ce75-6082-517d-dbe9d9823b92.png" width="50%">

Open supported linksをoffにすることでアプリリンクが無効になります。
またAdd linkからディープリンクが設定されたURLを追加することができます。

## 結論

ほとんどのユーザーは上記のような設定について熟知していない、かつ、OS12以上を使用している場合、アプリを開くかどうかの選択肢すら表示されないため、積極的にアプリへの遷移を優先したい場合アプリリンクを有効にする必要があると言えます。