-
Swift 딥링크 처리- AppDelegate와 SceneDelegate개발/Swift 2024. 4. 12. 00:03
딥링크는 앱 외부에서 특정 화면으로 이동할 수 있도록 도와주는 중요한 기능이다.
AppDelegate와 SceneDelegate에서 딥링크를 처리하는 방식 정리
딥 링크 구조
APPSCHEME://PATH1/PATH2?QUERYPARAMETER...
딥링크를 처리 하는 로직은 AppDelegate , SceneDelegate 에서 받아 처리 한다.
DynamicLink 를 사용 한다면 FirebaseDynamicLinks 기능 사용 하여 URL 처리 가능함
푸시 알람 + 딥링크 라면 userNotificationCenter 함수에서 처리
SceneDelegate - func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)
url 열때 호출됨
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { BranchHelper.scene(scene, openURLContexts: URLContexts) URLContexts.forEach({ context in let url = context.url if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url), let url = dynamicLink.url { //딥링크 처리 return } let handled = DynamicLinks.dynamicLinks().handleUniversalLink(url) { [weak self] (dynamiclink, _) in if let url = dynamiclink?.url { //딥링크 처리 } } }) }
SceneDelegate - func scene(_ scene: UIScene, continue userActivity: NSUserActivity)
유니버셜 링크를 통해 앱이 실행될때 사용됨
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return } let handled = DynamicLinks.dynamicLinks() .handleUniversalLink(url) { [weak self] (dynamiclink, _) in if let url = dynamiclink?.url { //딥링크 처리 } } }
Appdelegate - userNotificationCenter
푸시알람 터치할때 호출
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo if var deeplink = userInfo[AnyHashable("deeplink")] as? String { deeplink = deeplink.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? deeplink guard let url = URL(string: deeplink) else { return } if url.absoluteString.isFirebaseDynamicLink { DynamicLinks.dynamicLinks().handleUniversalLink(url) { [weak self] dynamicLink, _ in Debug.log("[PASSORDER] dynamicLink - \\(String(describing: dynamicLink?.url))") if let url = dynamicLink?.url { //딥링크 처리 } } } else { //딥링크 처리 } return }
링크에서 path와 queryItem을 꺼내 오려면
static func linkHandling(_ handleURL: URL?) -> Bool { guard let url = standardizeURL(handleURL), let urlComponents = URLComponents(string: url.absoluteString) else { return false } let paths = url.pathComponents.dropFirst().map({ $0 }) let queryItems = urlComponents.queryItems ?? [] //paths 와 queryItems 를 사용하여 딥링크 처리 ( 특정 View로 이동 ) }
'개발 > Swift' 카테고리의 다른 글
[Swift] Tab bar 와 Page view를 동시에 사용할때 (0) 2024.05.18 iOS 앱 자동화 Fastlane Fastfile 작성 Cheatsheet (0) 2024.04.29 Xcode Instrument 톺아보기 (0) 2024.04.11 Crashlytics & Google Analytics 를 이용한 원인 분석 (0) 2024.04.11 Async let & TaskGroup Concurrency 예시 (0) 2024.04.10