투케이2K

48. (TWOK/UTIL) [Ios/Swift] A_Main 웹뷰 앱 라이프 사이클 체크 및 리로드 수행 정리 본문

투케이2K 유틸파일

48. (TWOK/UTIL) [Ios/Swift] A_Main 웹뷰 앱 라이프 사이클 체크 및 리로드 수행 정리

투케이2K 2022. 6. 4. 18:29

[설 명]

프로그램 : Ios / Swift

설 명 : A_Main 웹뷰 앱 라이프 사이클 체크 및 리로드 수행 정리

 

[SceneDelegate - 소스 코드]

import UIKit

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

    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. UI 딜리게이트
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [빠른 로직 찾기 : 주석 로직 찾기]
    // -----------------------------------------
    // [SEARCH FAST] : [프리퍼런스 값 초기화 실시]
    // [SEARCH FAST] : [URL 스키마 접속 확인]
    // [SEARCH FAST] : [푸시 알림 뱃지 카운트 초기화]
    // [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("")
        
        // -----------------------------------------
        // [프리퍼런스에 포그라운드 시간 진입 시간 저장 실시]
        var foreMiliseconds = C_Util().dateToMilliseconds()
        var foreDate = C_Util().millisecondsToDate(str: foreMiliseconds)
        
        S_Preference().setString(_sKey: S_FinalData.PRE_WV_RESUME_TIME, _sValue: foreMiliseconds)
        
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneDidEnterBackground]")
        print("-------------------------------")
        print("설 명 :: Scene 포그라운드 전환 시간 저장")
        print("-------------------------------")
        print("[저장] 타임 스탬프 :: \(foreMiliseconds)")
        print("-------------------------------")
        print("현재 날짜 및 시간 :: \(foreDate)")
        print("====================================")
        print("")
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [메인 웹뷰 갱신 저장된 시간 확인 실시]
        var appState = S_Preference().getString(_sKey: S_FinalData.PRE_APP_UPDT_TIME)
        
        if appState != nil && appState.count>0 && appState != ""
            && appState.trimmingCharacters(in: .whitespacesAndNewlines) != "" {
        }
        else {
            // [널 값인 경우 기본 하드 코딩 시간 저장 실시]
            S_Preference().setString(_sKey: S_FinalData.PRE_APP_UPDT_TIME, _sValue: S_FinalData.PRE_WV_SAVE_TIME)
        }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [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()
            // -----------------------------------------
            // */
        }
        else {
            // [앱 라이프 사이클 갱신 저장 시간]
            var appCycleSave = S_Preference().getString(_sKey: S_FinalData.PRE_APP_UPDT_TIME)
            
            // [앱 라이프 사이클 포그라운드 및 백그라운드 시간 차이 확인 실시]
            var appCycleTime = C_Util().getDateMinus(
                bigDate: S_Preference().getString(_sKey: S_FinalData.PRE_WV_RESUME_TIME),
                smallDate: S_Preference().getString(_sKey: S_FinalData.PRE_WV_PAUSE_TIME))
            
            // [메인 웹뷰 사용 포그라운드 및 백그라운드 시간 차이 확인 실시]
            print("")
            print("====================================")
            print("[SceneDelegate >> sceneWillEnterForeground]")
            print("-------------------------------")
            print("설 명 :: [앱 라이프 사이클 갱신] 웹뷰 리로드 수행 실시")
            print("-------------------------------")
            print("앱 라이프 사이클 갱신 저장된 시간 [분 단위] :: \(appCycleSave)")
            print("-------------------------------")
            print("앱 라이프 사이클 포그라운드 및 백그라운드 시간 차이 [분 단위] :: \(appCycleTime)")
            print("====================================")
            print("")
            
            // [저장된 값이 모두 숫자로 구성되었는지 확인]
            var numCheck_NotNumber = false
            for numCheck in appCycleSave {
                if numCheck.isNumber == false { // 정수 값이 아닌 경우
                    numCheck_NotNumber = true
                }
            }
            if numCheck_NotNumber == false && appCycleTime >= Int(appCycleSave) ?? 0 {
                // -----------------------------------------
                // [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("")
        
        // [프리퍼런스에 백그라운드 시간 진입 시간 저장 실시]
        var backMiliseconds = C_Util().dateToMilliseconds()
        var backDate = C_Util().millisecondsToDate(str: backMiliseconds)
        
        S_Preference().setString(_sKey: S_FinalData.PRE_WV_PAUSE_TIME, _sValue: backMiliseconds)
        
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneDidEnterBackground]")
        print("-------------------------------")
        print("설 명 :: Scene 백그라운드 전환 시간 저장")
        print("-------------------------------")
        print("[저장] 타임 스탬프 :: \(backMiliseconds)")
        print("-------------------------------")
        print("현재 날짜 및 시간 :: \(backDate)")
        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