[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을 처리하도록 합니다:
swiftfunc 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을 전달받고 처리하도록 합니다:
swiftfunc 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을 처리하는 방식을 통해 원하는 화면으로의 네비게이션을 구현할 수 있습니다.