【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Swift】カスタムURLスキームの設定方法と特定のアプリ内画面に遷移させる方法について徹底解説!

【Swift】カスタムURLスキームの設定方法と特定のアプリ内画面に遷移させる方法について徹底解説!
ふくしま

こんにちは!株式会社メモリアインクのふくしまです!

この記事では、Swift 5.9とXcode 15を使用して、アプリ内の特定の画面にディープリンクを通じて遷移する方法について、サンプルコードを示しながら解説します。

この記事を読んで分かること…
・カスタムURLスキームとは?
・カスタムURLスキームの基本設定方法
・カスタムURLスキームを利用して特定のアプリ内画面に遷移させる具体的な実装方法

目次

カスタムURLスキームとは

カスタムURLスキームは、アプリケーションが独自に定義するURLスキームで、ユーザーをアプリの特定のコンテンツや画面へ直接案内するために使用されます。これにより、アプリ外部からのリンクを通じてアプリ内の特定の画面を開くことが可能になります。

カスタムURLスキームの実装

ステップ1:info.plistの設定

XcodeプロジェクトのInfoタブを開き、「URL Types」セクションに新しいURLスキームを追加します。例えば、myappというスキームを追加する場合、URL Schemesmyappを入力します。

【Swift】カスタムURLスキームの設定方法と特定のアプリ内画面に遷移させる方法について徹底解説!

ステップ2:遷移先の画面を用意

今回は例としてViewControllerとSecondViewControllerの2画面用意をします。
各々の画面とViewController、SecondViewControllerが紐づいていること確認してください。
また、各画面のStoryboard IDが設定されているかも確認してください。

【Swift】カスタムURLスキームの設定方法と特定のアプリ内画面に遷移させる方法について徹底解説!

ステップ3:SceneDelegateの編集

プロジェクト作成時にすでにあるSceneDelegate.swiftファイルを編集して、ディープリンクからの情報を処理するコードを追加します。

サンプルコード

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

  ・・・
    
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
            guard let url = URLContexts.first?.url else {
                return
            }
            handleDeepLinkURL(url)
        }
    private func handleDeepLinkURL(_ url: URL) {
        let urlString = url.absoluteString
        
        if urlString == "myapp://top" {
            navigateToTopViewController()
        }
        
        if urlString == "myapp://second" {
            navigateToSecondViewController()
        }
        
    }
    private func navigateToTopViewController() {
        // UIWindowSceneとそのrootViewControllerを取得します
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
              let rootViewController = windowScene.windows.first?.rootViewController else {
            return
        }
    }
        
    private func navigateToSecondViewController() {
        // StoryboardからSecondViewControllerをインスタンス化
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let secondViewController = storyboard.instantiateViewController(withIdentifier: "SecondViewControllerID") as? SecondViewController else {
            return
        }
        
        // UINavigationControllerを取得して遷移
        if let navigationController = window?.rootViewController as? UINavigationController {
            navigationController.pushViewController(secondViewController, animated: true)
        } else {
            // UINavigationControllerがrootViewControllerではない場合の対応
            // 例: rootViewControllerをUINavigationControllerに置き換える
            let navigationController = UINavigationController(rootViewController: secondViewController)
            window?.rootViewController = navigationController
            window?.makeKeyAndVisible()
        }
    }

    ・・・
}

サンプルコードの説明

9行目:
scene(_:openURLContexts:)メソッドは、アプリが外部からのURLを介して開かれた際に呼び出されます。
10−12行目:
guard文を使って、受け取ったURLの集合URLContextsから最初のURLを安全に取り出します。URLが存在しない場合は、メソッドから直ちに抜けます。
13行目:
取得したURLをhandleDeepLinkURLメソッドに渡して処理します。
15行目
handleDeepLinkURLメソッドは、受け取ったURLに基づいて適切な画面遷移を行います
16行目:
URLを文字列形式に変換します。
18−24行目:
文字列形式のURLを確認し、それがmyapp://topまたはmyapp://secondと一致する場合、それぞれnavigateToTopViewControllerまたはnavigateToSecondViewControllerメソッドを呼び出します。
27−33行目:
navigateToTopViewControllerメソッドは、myapp://top からアプリが立ち上がった場合にアプリのトップ画面に遷移させるためのメソッドです。
UIApplication.shared.connectedScenesから最初のシーンを取得しようと試みます。
取得したシーンがUIWindowSceneのインスタンスであるかどうかをチェックし、そうであればそのシーンをwindowSceneに代入します。
取得したwindowScenewindowsコレクションの最初のウィンドウから、rootViewControllerを取得します。これはアプリケーションの最初の画面(ルートビューコントローラー)を指します。
guard文の条件のいずれかが満たされない場合(つまり、適切なUIWindowSceneが見つからない、またはルートビューコントローラーが存在しない場合)、この時点で処理を中断し、return文によってメソッドから抜け出します。
35−52行目:
navigateToSecondViewControllerメソッドは、myapp://second からアプリが立ち上がった場合にSecondViewControllerへの遷移を担います。
37行目:
UIStoryboardクラスのインスタンスを作成します。このインスタンスは、アプリのメインStoryboardを表します(”Main”はStoryboardのファイル名)。
38−40行目:
Storyboard上で指定した識別子(”SecondViewControllerID”)を使用してSecondViewControllerのインスタンスを生成し、その型をSecondViewControllerにキャストします。この処理が失敗した場合(つまり、インスタンス化できないか、キャストに失敗した場合)、メソッドはここで終了します。
43−45行目:
アプリのwindowrootViewControllerUINavigationControllerのインスタンスであるか確認します。もし条件がtrue(つまり、ルートビューコントローラーがナビゲーションコントローラーである)ならば、SecondViewControllerをナビゲーションスタックにプッシュします。
45−52行目:
もしアプリのルートビューコントローラーがUINavigationControllerのインスタンスではない場合(例えば、最初からナビゲーションコントローラーが組み込まれていない場合)、新しくUINavigationControllerのインスタンスを作成し、そのルートビューコントローラーとしてSecondViewControllerを設定します。そして、アプリのwindowrootViewControllerをこの新しいナビゲーションコントローラーに置き換え、makeKeyAndVisibleメソッドを呼び出してウィンドウを表示状態にします。

動作確認

ふくしま

それではビルドして、動作確認してみましょう!

【Swift】カスタムURLスキームの設定方法と特定のアプリ内画面に遷移させる方法について徹底解説!

まとめ

いかがでしたか?
カスタムURLスキームを設定し、それを利用してアプリ内の特定の画面に直接遷移させる方法を解説しました。ディープリンクを利用することでアプリの使い勝手を大幅に向上させ、ユーザーエンゲージメントを高めることが期待できます。
この記事が、皆様の開発ライフの一助になれると幸いです!

ふくしま

この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
をオススメします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次