ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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로 이동 )
    		}        
            
    
    

    댓글

Designed by Tistory.