【iOS】ディープリンクの基本と実装方法を解説!

Swift

こんにちは。新人プログラマーの岩本です。

今回はディープリンクについて学んだことをまとめたいと思います。

ディープリンクはアプリ開発で頻繁に使われる技術です。

ぜひ最後までご覧ください。

この記事は新卒エンジニアが執筆しています。
そのため内容に間違いや不備がある場合があります。
もし間違いを発見しましたら、どんどん指摘していただけると幸いです。

ディープリンクとは

Webページや他のアプリから、アプリに遷移するリンクのことです。

例えばスマホのブラウザから「X」を開いてみてください。

するとこんなバナーが表示されると思います。

開くボタンをタップすると、アプリのXが起動します。

これがディープリンクです。

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

iOSでディープリンクを実現するには、大きく3つの方法があります。

  1. カスタムURLスキーム
  2. Universal Links
  3. Firebase Dynamic Links(非推奨)

1つずつ解説します。

カスタムURLスキーム

URLスキームとは、URLの://より前の部分のことです。

例えば httphttps などがありますが、これは規定URLスキームと呼ばれます。

このスキームをアプリ独自で定義することで、ディープリンクを実現します。

試した中ではこれが一番簡単でした。

実装方法

実装方法はシンプルです。

TARGETS > Info > URL Typesから設定するだけです。

今回はmyappというスキームを設定しました。

これでアプリをインストールしたiPhoneのブラウザから、myapp:// にアクセスするとアプリが起動できます。

URLから画面を出し分ける

URLのホストから表示する画面を切りかえてみましょう。

今回は myapp://next というURLなら、NextViewに遷移するようにします。

SwiftUIなら onOpenURL というモディファイアを使うことで、URLを取得できます。

ContentView.swift
struct ContentView: View {
    @State private var isActive = false
    var body: some View {
        NavigationStack {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                Text("Hello, world!")
            }
            .padding()
            .onOpenURL(perform: { url in
                if url.host() == "next" {
                    isActive = true
                }
            })
            .navigationDestination(isPresented: $isActive) {
                NextView()
            }
        }
    }
}

こうすることで、URLごとに表示したい画面を切りかえることができます。

注意点

カスタムURLスキームを使うときの注意点は以下の2つです。

  1. アプリがインストールされてないときの挙動を指定できない
  2. 他アプリとスキームが競合することがある

特に他アプリとの競合は注意が必要です。

もしスキームが被った場合は、先にインストールされていたアプリが優先されます。

どうやらこの挙動を利用した攻撃方法もあるらしいので、いっそう注意が必要です。

Universal Links

Universal LinksはAppleが提供しているサービスで、カスタムURLスキームと違い、普通のURLの見た目をしています。

アプリインストール時にApple CDNを経由して、サーバから apple-app-site-association というファイルを取得します。

このファイルはアプリとドメインを紐付けるためのファイルで、他アプリと同じドメインになることを避けることができます。

実装方法

実装はサーバとアプリの両方の対応が必要になります。

サーバ側の対応

今回はXserverで自前でサーバを借りて実装しました。

手順は以下の2通りです。

  1. apple-app-site-association を配置する
  2. MIMEタイプをapplication/json にする

apple-app-site-associationの配置場所は、ドメイン名/public_html/.well-known/の配下です。

内容は以下のとおりです。

apple-app-site-association
{
	"applinks": {
		"apps": [],
		"details": [
			{
				"appID": "{Team ID}.{Bundle ID}",
				"paths": ["*"]
			}
		]
	},
	"webcredentials": {
		"apps": ["{Team ID}.{Bundle ID}"]
	}
}

Team IDとBundle IDにはあなたの環境に合わせて書き換えてください。例えばTeam IDが「ABCDEF」、Bundle IDが「sample.bundle」の場合は、ABCDEF.sample.bundleになります。

次にMIMEタイプを application/json にします。

自分の場合は .htaccess に以下の記述を追加しました。

.htaccess
AddType application/json .well-known/apple-app-site-association

最後に以下のコマンドを実行してみてください。

Bash
curl -v https://app-site-association.cdn-apple.com/a/v1/ドメイン名

結果が返ってくれば、サーバ側の対応は完了です。

アプリの対応

CapabilitesにAssociated Domainsを追加して、「applinks:ドメイン名」と指定してください。

最後にアプリをインストールしたiPhoneのブラウザから、対応したドメインにアクセスしてください。

すると、アプリを起動するバナーが表示されると思います。

Firebase Dynamic Links

これはFirebaseが提供してるサービスです。

ですが2025 年8月25日に廃止予定なので、新規開発なら使わないほうがいいと思います。

まとめ

今回はディープリンクについて解説しました。

この方法を知っておけば、開発の幅が広がると思います。

ぜひご自身の手で色々と試してみてください。

ここまでのご閲覧ありがとうございました!

参考にした記事

[iOS] [社内勉強会資料] ディープリンクについて - Qiita
「ディープリンク」とはディープリンクとは、Webページやスマートフォンアプリからアプリの特定コンテンツへ移動するリンクのことです。ディープリンクは元々、あるWebサイトのページから他のWebサイ…
【SwiftUI】URLスキームを受け取る - Qiita
はじめにTwitterのURLスキームはURLスキームの種類によって起動する画面が振り分けられます。今回はその挙動をSwiftUIで再現してみます。TwitterのURLスキームタイムライン…

コメント

タイトルとURLをコピーしました