Notice
Recent Posts
Recent Comments
Link
투케이2K
48. (TWOK/UTIL) [Ios/Swift] A_Main 웹뷰 앱 라이프 사이클 체크 및 리로드 수행 정리 본문
[설 명]
프로그램 : 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)
// -----------------------------------------
// */
}
} // [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments