개발/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로 이동 )
		}