투케이2K

28. (TWOK/UTIL) [Ios/Swift] SceneDelegate - 애플리케이션 UI 관리 , URL 스키마 접속 관리 본문

투케이2K 유틸파일

28. (TWOK/UTIL) [Ios/Swift] SceneDelegate - 애플리케이션 UI 관리 , URL 스키마 접속 관리

투케이2K 2022. 3. 28. 09:40

[설 명]

프로그램 : Ios / Swift

설 명 : 애플리케이션 UI 관리 , URL 스키마 접속 관리

 

[소스 코드]

 

import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. UI 딜리게이트
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [빠른 로직 찾기 : 주석 로직 찾기]
    // -----------------------------------------
    // [SEARCH FAST] : [프리퍼런스 값 초기화 실시]
    // [SEARCH FAST] : [URL 스키마 접속 확인]
    // [SEARCH FAST] : [푸시 알림 뱃지 카운트 초기화]
    // [SEARCH FAST] : [웹뷰 리로드 상태 확인]
    // -----------------------------------------
    
    
    
    
    
    // MARK: - [윈도우 객체 선언 실시]
    var window: UIWindow?


    
    
    
    // MARK: - [UI창 선택적 구성 및 제공된 UI창에 Scene 연결]
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        print("")
        print("====================================")
        print("[SceneDelegate >> willConnectTo]")
        print("-------------------------------")
        print("설 명 :: UI창 선택적 구성 및 제공된 UI창에 Scene 연결 / 앱 접속 확인")
        print("====================================")
        print("")

        
        // -----------------------------------------
        guard let _ = (scene as? UIWindowScene) else { return }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [URL 스키마 접속 확인]
        // [사전 : info plist : URL Types 에 정의 필요]
        if let _url = connectionOptions.urlContexts.first?.url {
            
            // [스키마 접속 처리 핸들러 호출]
            self.schemeHandleURL(url: _url)
        }
        // -----------------------------------------
    }

    

    
    
    // MARK: - [시스템에 의해서 Scene 해제 : background 상태 및 session 삭제]
    func sceneDidDisconnect(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneDidDisconnect]")
        print("-------------------------------")
        print("설 명 :: 시스템에 의해서 Scene 해제 : background 상태 및 session 삭제")
        print("====================================")
        print("")
    }

    
    
    
    
    // MARK: - [Scene 활성화 및 사용자 이벤트에 응답 실시]
    func sceneDidBecomeActive(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneDidBecomeActive]")
        print("-------------------------------")
        print("설 명 :: Scene 활성화 및 사용자 이벤트에 응답 실시")
        print("====================================")
        print("")
    }

    
    
    
    
    // MARK: - [Scene 활성 상태 해제 및 사용자 이벤트에 대한 응답 중지]
    func sceneWillResignActive(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneWillResignActive]")
        print("-------------------------------")
        print("설 명 :: Scene 활성 상태 해제 및 사용자 이벤트에 대한 응답 중지")
        print("-------------------------------")
        print("상 태 :: 사용자 앱 백그라운드 전환 실시")
        print("====================================")
        print("")
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [프리퍼런스 값 초기화 실시]
        S_Preference().proccessBackgroungClear()
        // -----------------------------------------
    }

    
    
    
    
    // MARK: - [Scene 포그라운드 실행]
    func sceneWillEnterForeground(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneWillEnterForeground]")
        print("-------------------------------")
        print("설 명 :: Scene 포그라운드 실행")
        print("====================================")
        print("")
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [푸시 알림 뱃지 카운트 초기화]
        UIApplication.shared.applicationIconBadgeNumber = 0
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [웹뷰 리로드 상태 확인]
        let checkWebView = S_Preference().getString(_sKey: S_FinalData.PRE_WEBVIEW_RELOAD)
        
        // [웹뷰 리로드 수행해야하는 상태 인 경우]
        if checkWebView != nil && checkWebView.count>0 && checkWebView != ""
            && checkWebView.trimmingCharacters(in: .whitespacesAndNewlines) != "" {
            print("")
            print("====================================")
            print("[SceneDelegate >> sceneWillEnterForeground]")
            print("-------------------------------")
            print("설 명 :: 웹뷰 리로드 수행 실시")
            print("-------------------------------")
            print("checkWebView :: \(checkWebView)")
            print("====================================")
            print("")
            
            // -----------------------------------------
            // [SEARCH FAST] : [프리퍼런스 값 초기화 실시]
            S_Preference().webViewReloadClear()
            // -----------------------------------------
            
            
            ///*
            // -----------------------------------------
            // [Main 스토리보드 지정 실시]
            let storyboard = UIStoryboard(name: "Main", bundle: nil)

            
            // [Main 스토리보드에 포함된 개별 스토리보드 id 및 컨트롤러 지정]
            guard let rootVC = storyboard.instantiateViewController(identifier: "A_IntroVC") as? A_Intro
            else {
                print("")
                print("====================================")
                print("SceneDelegate >> sceneWillEnterForeground() :: 웹뷰 리로드 뷰 컨트롤러 확인 실패")
                print("====================================")
                print("")
                return
            }
            print("")
            print("====================================")
            print("SceneDelegate >> sceneWillEnterForeground() :: 웹뷰 리로드 뷰 컨트롤러 연결 실시")
            print("-------------------------------")
            print("뷰 컨트롤러 :: ", "A_Intro")
            print("====================================")
            print("")
            
            
            // [윈도우 객체에 루트 컨트롤러 지정 실시]
            let rootNC = UINavigationController(rootViewController: rootVC)
            self.window?.rootViewController = rootNC
            self.window?.makeKeyAndVisible()
            
            
            // [뷰 컨트롤러 데이터 지정 실시]
            let topViewController = self.window?.rootViewController as? UINavigationController // 네비게이션 뷰 컨트롤러 지정
            topViewController?.isNavigationBarHidden = true // 네비게이션 컨트롤러 상태 바 숨기기 설정
            let currentVC = topViewController?.topViewController as? A_Intro
            
            
            // [뷰 컨트롤러 메소드 호출 실시]
            currentVC?.webViewReload()
            // -----------------------------------------
            // */
        }
        // -----------------------------------------
    }

    
    
    
    
    // MARK: - [Scene 백그라운드 실행]
    func sceneDidEnterBackground(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneDidEnterBackground]")
        print("-------------------------------")
        print("설 명 :: Scene 백그라운드 실행")
        print("====================================")
        print("")
    }
    
    
    
    
    
    // MARK: - [URL 스키마 접속 체크 부분]
    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
        print("")
        print("====================================")
        print("[SceneDelegate >> openURLContexts :: URL 스키마 접속 체크 실시]")
        print("-------------------------------")
        print("설 명 :: URL 스키마 접속 체크 실시")
        print("====================================")
        print("")
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [URL 스키마 접속 확인]
        // [사전 : info plist : URL Types 에 정의 필요]
        if let _url = URLContexts.first?.url {
            
            // [스키마 접속 처리 핸들러 호출]
            self.schemeHandleURL(url: _url)
        }
        // -----------------------------------------
    }
    
    
    
    
    
    // MARK: - [URL 스키마 접속 처리 메소드]
    // [SEARCH FAST] : [URL 스키마 접속 확인]
    func schemeHandleURL (url: URL){
        print("")
        print("====================================")
        print("SceneDelegate >> schemeHandleURL() :: URL 스키마 접속 처리 핸들러 수행 실시")
        print("====================================")
        print("")
        
        
        // -----------------------------------------
        // [호스트 명 사용 : 스키마 접속 형태 확인 : [스키마://호스트?]]
        let urlStr = url.absoluteString // [스키마 주소값 가지고 온다]
        let components = URLComponents(string: urlStr) // 전체 주소
        //let pathData = components?.path ?? "" // http url path 경로
        let schemeData = components?.scheme ?? "" // 스키마
        let hostData = components?.host ?? "" // 호스트
        let parameter = components?.query ?? "" // 파라미터

        ///*
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[SceneDelegate >> schemeHandleURL() :: 스키마 접속 확인 및 파라미터 값 확인 실시]")
        print("-------------------------------")
        print("urlStr [전체] :: ", urlStr)
        print("-------------------------------")
        print("scheme [스키마] :: ", schemeData)
        print("-------------------------------")
        print("host [호스트] :: ", hostData)
        print("-------------------------------")
        print("query [데이터] :: ", parameter)
        print("====================================")
        print("")
        //*/
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [스키마 데이터 값을 저장하기 위한 변수]
        var dicData : Dictionary<String, Any> = [String : Any]()
        
        if parameter != nil
            && parameter.count > 0
            && parameter.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && parameter.isEmpty == false { // [스키마 데이터가 널이 아닌 경우]
            print("")
            print("====================================")
            print("[SceneDelegate >> schemeHandleURL() :: 스키마 데이터 값 [포함] 로직 처리 실시]")
            print("====================================")
            print("")
            
            // [스키마 데이터 키값 확인]
            let items = components?.queryItems ?? []
            
            // [for 문을 돌면서 데이터 확인 실시]
            for item in items {
                print("")
                print("====================================")
                print("[SceneDelegate >> schemeHandleURL() :: 스키마 데이터 [개별] 파싱 수행]")
                print("-------------------------------")
                print("key :: \(item.name)  /  value :: \(item.value ?? "")")
                print("====================================")
                print("")
                
                // [딕셔너리에 데이터 삽입 실시]
                dicData["\(item.name)"] = "\(item.value ?? "")"
            }
        }
        else { // [스키마 데이터가 널인 경우]
            print("")
            print("====================================")
            print("[SceneDelegate >> schemeHandleURL() :: 스키마 데이터 값 [NULL] 로직 처리 실시]")
            print("====================================")
            print("")
        }
        // -----------------------------------------
        
        
        ///*
        // -----------------------------------------
        // [Main 스토리보드 지정 실시]
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        
        // [Main 스토리보드에 포함된 개별 스토리보드 id 및 컨트롤러 지정]
        guard let rootVC = storyboard.instantiateViewController(identifier: "A_IntroVC") as? A_Intro
        else {
            print("")
            print("====================================")
            print("SceneDelegate >> schemeHandleURL() :: 스키마 접속 처리 뷰 컨트롤러 확인 실패")
            print("====================================")
            print("")
            return
        }
        print("")
        print("====================================")
        print("SceneDelegate >> schemeHandleURL() :: 스키마 접속 처리 뷰 컨트롤러 연결 실시")
        print("-------------------------------")
        print("뷰 컨트롤러 :: ", "A_Intro")
        print("====================================")
        print("")
        
        
        // [윈도우 객체에 루트 컨트롤러 지정 실시]
        let rootNC = UINavigationController(rootViewController: rootVC)
        self.window?.rootViewController = rootNC
        self.window?.makeKeyAndVisible()
        
        
        // [뷰 컨트롤러 데이터 지정 실시]
        let topViewController = self.window?.rootViewController as? UINavigationController // 네비게이션 뷰 컨트롤러 지정
        topViewController?.isNavigationBarHidden = true // 네비게이션 컨트롤러 상태 바 숨기기 설정
        let currentVC = topViewController?.topViewController as? A_Intro
        
        
        // [뷰 컨트롤러 : url 스키마로 접속을 체크하는 곳으로 데이터 전송 : 스키마 / 호스트 / 스키마 데이터]
        currentVC?.urlSchemeCheck(_scheme: schemeData, _host: hostData, _dataDic: dicData)
        // -----------------------------------------
        // */
    }
    

} // [클래스 종료]

 

반응형
Comments