こんにちは!株式会社メモリアインクのふくしまです!
この記事では、Swift 5.9とXcode 15を使用して、アプリ内の特定の画面にディープリンクを通じて遷移する方法について、サンプルコードを示しながら解説します。
この記事を読んで分かること…
・カスタムURLスキームとは?
・カスタムURLスキームの基本設定方法
・カスタムURLスキームを利用して特定のアプリ内画面に遷移させる具体的な実装方法
カスタムURLスキームとは
カスタムURLスキームは、アプリケーションが独自に定義するURLスキームで、ユーザーをアプリの特定のコンテンツや画面へ直接案内するために使用されます。これにより、アプリ外部からのリンクを通じてアプリ内の特定の画面を開くことが可能になります。
カスタムURLスキームの実装
ステップ1:info.plistの設定
XcodeプロジェクトのInfo
タブを開き、「URL Types」セクションに新しいURLスキームを追加します。例えば、myapp
というスキームを追加する場合、URL Schemes
にmyapp
を入力します。
ステップ2:遷移先の画面を用意
今回は例としてViewControllerとSecondViewControllerの2画面用意をします。
各々の画面とViewController、SecondViewControllerが紐づいていること確認してください。
また、各画面のStoryboard IDが設定されているかも確認してください。
ステップ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
に代入します。
取得したwindowScene
のwindows
コレクションの最初のウィンドウから、rootViewController
を取得します。これはアプリケーションの最初の画面(ルートビューコントローラー)を指します。guard
文の条件のいずれかが満たされない場合(つまり、適切なUIWindowScene
が見つからない、またはルートビューコントローラーが存在しない場合)、この時点で処理を中断し、return
文によってメソッドから抜け出します。
・35−52行目:navigateToSecondViewController
メソッドは、myapp://second
からアプリが立ち上がった場合にSecondViewController
への遷移を担います。
・37行目:UIStoryboard
クラスのインスタンスを作成します。このインスタンスは、アプリのメインStoryboardを表します(”Main”はStoryboardのファイル名)。
・38−40行目:
Storyboard上で指定した識別子(”SecondViewControllerID”)を使用してSecondViewController
のインスタンスを生成し、その型をSecondViewController
にキャストします。この処理が失敗した場合(つまり、インスタンス化できないか、キャストに失敗した場合)、メソッドはここで終了します。
・43−45行目:
アプリのwindow
のrootViewController
がUINavigationController
のインスタンスであるか確認します。もし条件がtrue
(つまり、ルートビューコントローラーがナビゲーションコントローラーである)ならば、SecondViewController
をナビゲーションスタックにプッシュします。
・45−52行目:
もしアプリのルートビューコントローラーがUINavigationController
のインスタンスではない場合(例えば、最初からナビゲーションコントローラーが組み込まれていない場合)、新しくUINavigationController
のインスタンスを作成し、そのルートビューコントローラーとしてSecondViewController
を設定します。そして、アプリのwindow
のrootViewController
をこの新しいナビゲーションコントローラーに置き換え、makeKeyAndVisible
メソッドを呼び出してウィンドウを表示状態にします。
動作確認
それではビルドして、動作確認してみましょう!
まとめ
いかがでしたか?
カスタムURLスキームを設定し、それを利用してアプリ内の特定の画面に直接遷移させる方法を解説しました。ディープリンクを利用することでアプリの使い勝手を大幅に向上させ、ユーザーエンゲージメントを高めることが期待できます。
この記事が、皆様の開発ライフの一助になれると幸いです!
この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
コメント