[Swift] DeepLink와 앱 내 네비게이션 통합: DeepLink를 통해 특정 화면으로 바로 이동하는 방법

작성일 :

[Swift] DeepLink와 앱 내 네비게이션 통합: DeepLink를 통해 특정 화면으로 바로 이동하는 방법

DeepLink는 사용자가 앱을 실행할 때 특정 화면으로 바로 이동할 수 있게 해주는 강력한 도구입니다. 이 글에서는 Swift를 활용하여 DeepLink를 통해 특정 화면으로 사용자 경험을 향상시키는 방법을 다뤄보겠습니다.

DeepLink란?

DeepLink는 앱 내 특정 완료 상태나 화면으로 사용자를 직접 안내하는 URL 구조입니다. 일반적인 URL과 마찬가지로 스키마, 호스트, 경로 및 쿼리 매개변수를 포함할 수 있습니다. 이를 통해 사용자는 앱이 실행될 때 필요한 정보를 전달받아 앱에서 그에 대응하는 화면으로 바로 이동할 수 있습니다.

iOS에서 DeepLink 설정하기

iOS 앱에서 DeepLink를 설정하려면 몇 가지 단계를 거쳐야 합니다. 각 단계를 자세히 살펴보겠습니다.

Info.plist에 URL 스키마 추가

먼저, 프로젝트의 Info.plist 파일에 URL 스키마를 추가해야 합니다. 이를 통해 앱이 지정된 URL로 실행될 때 해당 URL을 처리할 수 있게 됩니다. 예를 들어, 다음과 같이 URL 스키마를 설정할 수 있습니다:

xml
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.example.app</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

여기서 myapp은 URL 스키마로, myapp:// 형태의 URL을 통해 앱을 실행할 수 있습니다.

AppDelegate에서 DeepLink 처리

이제 AppDelegate에서 DeepLink를 처리할 수 있는 메서드를 추가해야 합니다. application(_:open:options:) 메서드를 활용하여 URL을 전달받고 해당 URL을 처리하도록 합니다:

swift
func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
          let host = components.host else {
        return false
    }

    switch host {
    case "detail":
        if let id = components.queryItems?.first(where: { $0.name == "id" })?.value {
            // 특정 화면으로 이동하는 로직
            navigateToDetail(with: id)
        }
    default:
        break
    }

    return true
}

private func navigateToDetail(with id: String) {
    // 네비게이션 구현
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if let detailViewController = storyboard.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController {
        detailViewController.id = id
        if let navigationController = window?.rootViewController as? UINavigationController {
            navigationController.pushViewController(detailViewController, animated: true)
        }
    }
}

여기서 URL의 호스트와 쿼리 매개변수를 분석하여 적절한 화면으로 이동하는 로직을 구현합니다.

SceneDelegate에서 DeepLink 처리 (iOS 13 이상)

iOS 13 이상에서는 SceneDelegate를 통해서도 DeepLink를 처리할 수 있습니다. scene(_:willConnectTo:options:) 메서드를 활용하여 URL을 전달받고 처리하도록 합니다:

swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let urlContext = connectionOptions.urlContexts.first {
        handleDeepLink(urlContext.url)
    }
}

private func handleDeepLink(_ url: URL) {
    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
          let host = components.host else {
        return
    }

    switch host {
    case "detail":
        if let id = components.queryItems?.first(where: { $0.name == "id" })?.value {
            navigateToDetail(with: id)
        }
    default:
        break
    }
}

private func navigateToDetail(with id: String) {
    // 앞서 AppDelegate에서 구현한 네비게이션 로직 재사용
}

여기서도 URL의 호스트와 쿼리 매개변수를 분석하여 적절한 화면으로 네비게이션하는 로직을 구현합니다.

결론

이 글에서는 Swift를 통해 DeepLink를 설정하고 앱 내 네비게이션을 통합하는 방법을 소개했습니다. DeepLink를 통해 사용자는 특정 화면으로 바로 이동할 수 있으며, 이를 통해 사용자 경험을 크게 향상시킬 수 있습니다. Info.plist 파일에 URL 스키마를 추가하고, AppDelegate와 SceneDelegate에서 URL을 처리하는 방식을 통해 원하는 화면으로의 네비게이션을 구현할 수 있습니다.