【Swift/iOS】Custom URL Scheme(ディープリンク)の実装方法!アプリ間の遷移
この記事からわかること
- Swift/iOSのCustom URL Scheme(ディープリンク)の実装方法
- ユニバーサルリンクとの違い
- データの受け渡し
- 異なるのアプリ間の遷移
index
[open]
\ アプリをリリースしました /
環境
- Xcode:26.0.1
- iOS:26
- Swift:6
- macOS:Tahoe 26.0.1
Custom URL Scheme(ディープリンク)とは?
iOSの「Custom URL Scheme」はディープリンクの一種でアプリを直接起動させることができるリンクのことです。これを使用することでアプリを起動させるだけでなく、特定の画面を開いた状態で起動させたりデータのやり取りなどを行うことも可能です。
Custom URL Schemeでは固有のスキーム(例:my-test-app://)を設定することで対象のアプリを開くことができるようになります。
Androidでは「ディープリンク」が同じような仕組みの機能になります。
ユニバーサルリンクとの違い
同じようなディープリンクにユニバーサルリンクがあります。これはhttps://を使用してアプリを起動させることができます。
| Custom URL Scheme | ユニバーサルリンク | |
|---|---|---|
| スキーム | 任意のスキーム | HTTPS |
| アプリ未インストール時の挙動 | 動作しない | Webページを開く |
| 競合のリスク | スキームが被ると動作しない | なし |
| セキュリティ | 低い(誰でも同名スキームを作成できる) | 高い(ドメイン所有証明済み) |
| 実装方法 | アプリで完結 | サーバーへの設置も必要 |
またこれらの仕組みはAndroidでも同じような仕組みが存在します。
| Android | iOS |
|---|---|
| AppLinks | ユニバーサルリンク |
| ディープリンク | Custom URL Scheme |
詳細な実装方法は以下の記事を参考にしてください。
Custom URL Scheme(ディープリンク)の実装方法
実装するのは簡単で「TARGET」>「info」>「URL Types」 の「+」をクリックしてIdentifierとURL Schemesに適切な値を入れておくだけです。
Identifierはアプリを一意に識別できる値であれば良いのでバンドルIDなどにしておくと安心です。URL Schemesは実際にアプリを起動させるためのスキームになるので対象アプリがスキーム名から分かるような命名を行えば基本何でも良さそうです。
この設定を行うと「info.plist」にも以下のような設定値が反映されるようになります。上記で設定した値は実際には「info.plist」で管理されているだけなので共通です。
これで実装は完了なのでちゃんと実装できているか試してみます。前提として端末に対象アプリがインストールされている必要があるので注意してください。
Safariを開いて検索欄に先ほど指定したURL Schemesの末尾に://を付与したものを入力して確定します。
すると「このページを"対象アプリ名"で開きますか?」と出るので「開く」をクリックするとアプリを起動させることができます。
リンクが動作しない場合の原因は?
リンクが正しく動作しない場合は以下の点を確認してみてください。
- アプリがインストールされているか
- スキームが他のアプリと重複していないか
スキーム名は一部Appleネイティブアプリ用に定義されているので重複しないように注意してください。
データを受け渡す
Custom URL Schemeを使用してアプリにデータを渡すことも可能です。スキームでアプリを起動できるように設定さえしてしまえばリンクにクエリなどを使用してデータを付与するだけでデータを渡すことができるようになるので、その値に応じてアプリ内で処理を行えば特定の画面へ遷移させたり、データを保存するといったことが可能になります。
URL経由でアプリが起動した際にURLを取得するのはUIKit(Storyboard)とSwift UIで異なるので注意してください。
UIKit(Storyboard)のライフサイクルでURLを取得する
UIKit(Storyboard)のライフサイクルの場合はSceneDelegateクラスのscene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)からURL経由でアプリを起動した際のリンクを取得することができます。
例えばmy-test-app://profile?user=123のようなリンクで起動したとします。するとURLオブジェクトから対象の値を取得することができるようになります。
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
// 〜〜〜〜〜〜〜〜
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else {
return
}
print("URL: \(url.absoluteString)") // my-test-app://profile:8080?user=123
print("Scheme : \(url.scheme!)") // my-test-app
print("Query : \(url.query!)") // user=123
}
}
AppDelegateのapplication(_ :, open url:, options:)で取得できる記事をちらほらありましたが現在は(?)取得できないようなので注意してください。
SwiftUIのライフサイクルでURLを取得する
Swift UIの場合はonOpenURLモディファイアから対象のURLを取得することができます。AppDelegateなどを実装しても変わらず取得できないので注意してください。
@main
struct LinkTestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
print("URL: \(url.absoluteString)") // my-test-app://profile:8080?user=123
print("Scheme : \(url.scheme!)") // my-test-app
print("Query : \(url.query!)") // user=123
}
}
}
}
異なるアプリ間の遷移
Custom URL Schemeを使用することでアプリAからアプリBを起動するといったことができるようになります。起動させるにはopenメソッドを使用するだけですが少し注意点があります。
guard let url = URL(string: "my-test-appb://") else { return }
guard UIApplication.shared.canOpenURL(url) else { return }
UIApplication.shared.open(url)
LSApplicationQueriesSchemesキーの追加
アプリ内からCustom URL Schemeを使用してアプリを起動させたい場合はLSApplicationQueriesSchemesキーの指定が必要になります。そのため「info.plist」の中にLSApplicationQueriesSchemesキーを追加し、配列内にアプリ内から起動させたいアプリのスキームを追加してください。
例えば「アプリAからアプリBを起動したい場合はアプリAのinfo.plistにアプリBのスキームを追加」すればOKです。
アプリAからアプリAのCustom URL Schemeを利用する
アプリAの中からアプリAのCustom URL Schemeを利用することも一応可能ではあります。これは例えばFirebaseなどのモーダルやメッセージ表示を行っている際にそこのタップイベントでCustom URL Schemeを仕込みたい場合などです。実装方法は基本差分なく「info.plist」の中にLSApplicationQueriesSchemesキーの追加だけ行い、アプリAのなかでアプリAを開くようにしてあげればOKです。
guard let url = URL(string: "my-test-appb://") else { return }
guard UIApplication.shared.canOpenURL(url) else { return }
UIApplication.shared.open(url)
ただ呼び出された時にアプリ自体が再度1から立ち上がる(最初の画面から表示された)ので元の画面まで遷移させるなどハンドリングをしてあげた方が良さそうです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。





