Notice
Recent Posts
Recent Comments
Link
투케이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)
// -----------------------------------------
// */
}
} // [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments