개발/Swift
Swift 딥링크 처리- AppDelegate와 SceneDelegate
덤벨로퍼
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로 이동 )
}