Custom URL schemeとDeep Linkingの概要

## Custom URL scheme とは

### iOSの場合 (Custom URL scheme) : やや非推奨

> カスタムURLスキームは、アプリ内のリソースを参照する方法を提供します。たとえば、ユーザーがメール内のカスタム URL をタップすると、指定されたコンテキストでアプリが起動します。他のアプリが、特定のコンテキスト データを使用してアプリを起動するようにトリガーすることもできます。たとえば、フォト ライブラリ アプリは指定された画像を表示する場合があります。
> 
> https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app

#### 実装方法

##### 呼び出されるアプリにschemeを設定する

https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app

`CFBundleURLTypes`を設定すると、作成しているアプリでアプリ自身を呼ぶことや、他のアプリ・ブラウザから呼び出しがあったときにそのアプリに遷移するようになる。

```xml:Info.plist: 呼び出されるアプリにschemeを設定する
<dict>
	<key>CFBundleURLTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>None</string>
			<key>CFBundleURLName</key>
			<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>my-app-scheme</string>
			</array>
		</dict>
	</array>
</dict>
```

##### schemeで他のアプリを呼び出すには

呼び出し側のアプリで[canOpenURL(_:)](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl)を使用し、Schemeに対応したアプリがデバイスにインストールされているかを確認する場合は、`LSApplicationQueriesSchemes`に配列でSchemeを設定しておく必要がある。
※設定していない場合は、[canOpenURL(_:)](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl) の返却値が一律falseになる。

なお作成しているアプリが自身を[canOpenURL(_:)](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl)で判別した場合は、`LSApplicationQueriesSchemes`の設定に関わらず一律trueが返却される。
※設定していない場合でも、[open(_:options:completionHandler:)](https://developer.apple.com/documentation/uikit/uiapplication/1648685-open)による「該当アプリの呼び出し自体」を拒否出来る訳ではない。(iOS 15.2で確認)

```xml:Info.plist: 呼び出し側のアプリで、呼び出したいアプリのSchemeを設定する
<dict>
	<key>LSApplicationQueriesSchemes</key>
	<array>
		<string>scheme</string>
	</array>
</dict>
```

```swift
// インストール状況を確認してからアプリを呼び出す
if UIApplication.shared.canOpenURL(URL(string: "my-app-scheme://")!) {
   UIApplication.shared.open(URL(string: "my-app-scheme://")!, options: [:])
}

or

// インストール状況を確認を確認せずにアプリを呼び出す。なお自身の application(_:didFinishLaunchingWithOptions:) を呼ぶ際は、canOpenURL がなくても良い様に思う
UIApplication.shared.open(URL(string: "my-app-scheme://")!, options: [:])
```

### Androidの場合 (Deep links) : やや非推奨

> ディープリンクは、ユーザーをアプリの特定の部分に直接誘導する、あらゆるスキームのURIです。ディープリンクを作成するには、アプリ内の適切なアクティビティにユーザーを誘導するインテント フィルタを追加します。次のコード スニペットをご覧ください。
> 
> https://developer.android.com/training/app-links?hl=ja#deep-links

#### 実装方法

https://developer.android.com/training/app-links/deep-linking?hl=ja

## Deep Linking とは

### iOSの場合 (Deep Linking) : 非推奨

iOSでURIリンクをタップした際に、対応したアプリがインストールされている場合はそのアプリへ遷移する仕組み。

Webページを開いた後に、更にアプリへ遷移するアニメーションが入るため、`Universal Links`と比べるとUXが劣ります。
またインストールされていない場合はブラウザでWebページを開いた状態で終わり、App Storeへの流入は行えません。

### iOSの場合 (Universal Links) : 推奨, iOS 9+

`Deep Linking`のUXが低い部分を改善した、App Storeやアプリへ遷移する仕組み。

アプリのインストールがされていない場合は、App Storeのアプリ紹介ページへ送ります。
インストールされている場合は、そのアプリで開きURLパラメータとから、データを受け取ります。

#### 実装方法

https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content

https://qiita.com/chichilam/items/9b646cdf4409d287195b

### Androidの場合 (Web links) : 非推奨

> ウェブリンクは、HTTP または HTTPS スキームを使用するディープリンクです。Android 12 以降では、ウェブリンク（Android アプリリンクではない）をクリックすると、常にウェブブラウザにコンテンツが表示されます。以前のバージョンの Android を搭載したデバイスでは、自分のアプリ、またはユーザーのデバイスにインストールされている他のアプリもウェブリンクを処理できる場合、ユーザーはブラウザに直接移動しない可能性があります。代わりに、図 2 のような確認ダイアログが表示されます。
> 
> https://developer.android.com/training/app-links?hl=ja#web-links

### Androidの場合 (Android App Links) : 推奨, Android 6.0+

特定のドメインを開いた際に、ユーザーにどのアプリで尋ねずに直接対応したアプリで開く仕組み。
またAndroid 12以降であれば、システム設定画面から「そのアプリがデフォルトで開くドメインを、ユーザーが選択出来る」ようになった。

> Android 6.0（API レベル 23）以降で利用可能な Android アプリリンクは、HTTP および HTTPS スキームを使用し、autoVerify 属性を含むウェブリンクです。この属性を使用すると、アプリは特定のタイプのリンクのデフォルト ハンドラとしてアプリ自体を指定できます。アプリがインストールされていれば、ユーザーが Android アプリリンクをクリックするとすぐに起動し、確認ダイアログは表示されません。
> 
> https://developer.android.com/training/app-links?hl=ja#android-app-links

[Android アプリリンクとは？ | Adjustモバイルマーケティング用語集 | Adjust](https://www.adjust.com/ja/glossary/android-app-links/)

#### 実装方法

[Android AppLinksについて #Android - Qiita](https://qiita.com/t_shimokawa/items/dace08a2a10e2c04d162#android-12%E3%81%A7%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9)
[HTTP URLをAndroidアプリで開くために調べたこと #Android - Qiita](https://qiita.com/zinc0765/items/65044b21b90516f5dc71)

## Deferred Deep Link とは

アプリのインストールがされていない場合は、App Storeのアプリ紹介ページ(*1)へ送ります。
App Storeからアプリをインストールして起動後に、流入時のコンテキスト(データ)を引き継ぐことが出来る。
受け取る主なコンテキストとしては特定の画面に遷移するためのID、キャンペーンIDやクーポンコードなどになると思います。

インストール済みの場合は、そのアプリで開きURLとURLパラメータ(コンテキスト)を受け取ります。

*1: ランディングページ(LP)を用意し、Appsflyer OneLinkやAdjustなどを用いれば、LPでアプリ紹介とApp Storeを案内をすることも出来る

**Deep LinkingとDeferred Deep Linkの違い**
- Deep Linkingの場合
    - 未インストール
        - App Storeを表示する。**コンテキストはその場で破棄される**
    - インストール済
        - アプリが起動し、コンテキストを受け取る
- Deferred Deep Linkingの場合
    - 未インストール
        - App Storeを表示する
        - **App Storeの表示する代わりに、LPを表示する**
        - **App Storeからアプリをインストールして起動後に、流入時のコンテキストを引き継ぐことが出来る**
    - インストール済
        - アプリが起動し、コンテキストを受け取る

### Deferred Deep Linkに対応している主なサービスプロバイダ・ベンダー

- Adjust OneLink
- AppsFlyer
- Bitly
- Branch
- Kochava

# 関連する技術

## App Tracking Transparency (ATT) と SKAdNetwork (SKAN)

> Appleのユーザープライバシー規制により、トラッキング目的でデータを収集しパートナーと共有する場合、iOSデバイスのIDFAにアクセスするためのユーザー同意が必要となります。
> 
> AdjustのiOSおよびSKANソリューションを使用すると、プロセスの全段階でユーザープライバシーを保護しつつ、効果的なiOSキャンペーンを実施できます。
> 
> [ATTとSKANソリューション | Adjust Help Center](https://help.adjust.com/ja/article/ios-att-and-skadnetwork)

### サポートOS
- App Tracking Transparency iOS 14.5以降
- SKAdNetwork 3 : iOS 11.3以降
- SKAdNetwork 4 : iOS 16.1以降

### 参考ページ

- ATTとSKAN
    - [ATTとSKANソリューション | Adjust Help Center](https://help.adjust.com/ja/article/ios-att-and-skadnetwork)
- ATT
    - [App Tracking Transparency（ATT）framework | Adjust Help Center](https://help.adjust.com/ja/article/app-tracking-transparency-att-framework)
    - [レガシー版iOSプレースホルダーと指標の動作 | Adjust Help Center](https://help.adjust.com/ja/article/behavior-of-legacy-ios-placeholders-and-metrics)
    - [Q&A ： Appleの「 ATT 」とは何か？ - アプリによるIDFAへのアクセス許可を促す通知 | DIGIDAY［日本版］](https://digiday.jp/platforms/cheat-sheet-apple-has-set-a-date-for-its-privacy-push-on-advertising-now-comes-the-hard-part/)
- SKAdNetwork
    - [SKAdNetwork 3の基本 | Adjust Help Center](https://help.adjust.com/ja/article/skadnetwork)
    - [SKAdNetwork 4の仕組み | Adjust Help Center](https://help.adjust.com/ja/article/how-skadnetwork-4-works)
    - [iOSアプリのSKAdNetwork計測対応について - ヘルプ - Yahoo!広告](https://ads-help.yahoo-net.jp/s/article/H000044265?language=ja)