투케이2K

321. (ios/SwiftUI) [SwiftUI] 기본 프로젝트 생성 및 AppDelegate , SceneDelegate 클래스 커스텀 생성 본문

IOS

321. (ios/SwiftUI) [SwiftUI] 기본 프로젝트 생성 및 AppDelegate , SceneDelegate 클래스 커스텀 생성

투케이2K 2022. 11. 22. 16:12

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[프로젝트 생성 방법 및 기본 구조]

 

[AppDelegate : 소스 코드]

import Foundation
import UIKit

class MyAppDelegate: NSObject, UIApplicationDelegate {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 애플리케이션 딜리게이트 : 커스텀 생성
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [빠른 로직 찾기 : 주석 로직 찾기]
    // -----------------------------------------
    // [SEARCH FAST] : []
    // -----------------------------------------
    
    
    
    
    
    // MARK: - [전역 변수 선언 실시]
    
    
    
    
    
    // MARK: - [앱 프로세스 완료 및 앱 실행 실시]
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        print("")
        print("====================================")
        print("[AppDelegate >> didFinishLaunchingWithOptions]")
        print("-------------------------------")
        print("설 명 :: 앱 프로세스 완료 및 앱 실행 실시")
        print("====================================")
        print("")
        
        
        // -----------------------------------------
        // [LaunchScreen 로딩화면 지연 실시 - 3초]
        // Thread.sleep(forTimeInterval: 3.0)
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [SEARCH FAST] : [빌드 타입 확인 실시]
        #if DEBUG
            print("")
            print("====================================")
            print("[AppDelegate >> didFinishLaunchingWithOptions]")
            print("-------------------------------")
            print("설 명 :: ", "빌드 타입 확인 실시")
            print("-------------------------------")
            print("빌드 타입 :: ", "DEBUG 실행")
            print("====================================")
            print("")
        #else
            print("")
            print("====================================")
            print("[AppDelegate >> didFinishLaunchingWithOptions]")
            print("-------------------------------")
            print("설 명 :: ", "빌드 타입 확인 실시")
            print("-------------------------------")
            print("빌드 타입 :: ", "RELEASE 실행")
            print("====================================")
            print("")
        #endif
        // -----------------------------------------

        
        // -----------------------------------------
        return true
        // -----------------------------------------
    }



    
    
    // MARK: - [Scene 만들기 위한 구성 객체 반환 : 스토리보드 , info]
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        print("")
        print("====================================")
        print("[AppDelegate >> configurationForConnecting]")
        print("-------------------------------")
        print("설 명 :: Scene 만들기 위한 구성 객체 반환 : 스토리보드 , info")
        print("====================================")
        print("")

        // MARK: [MySceneDelegate 지정]
        let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
        sceneConfig.delegateClass = MySceneDelegate.self
        return sceneConfig
    }

    
    
    
    
    // MARK: - [Scene 구성 객체 해제 실시]
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        print("")
        print("====================================")
        print("[AppDelegate >> didDiscardSceneSessions]")
        print("-------------------------------")
        print("설 명 :: Scene 구성 객체 해제 실시")
        print("====================================")
        print("")
    }
    
    
    
    
    
    // MARK: - [애플리케이션 사용자가 작업 태스크 날린 이벤트 감지]
    func applicationWillTerminate(_ application: UIApplication) {
        print("")
        print("====================================")
        print("[AppDelegate >> applicationWillTerminate]")
        print("-------------------------------")
        print("설 명 :: 애플리케이션 사용자가 작업 태스크 날린 이벤트 감지")
        print("====================================")
        print("")
    }
    
    
    
    
    
    // MARK: - [디바이스 화면 세로 모드 고정 실시]
    //*
    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        /*
        print("")
        print("====================================")
        print("[AppDelegate >> supportedInterfaceOrientationsFor]")
        print("-------------------------------")
        print("설 명 :: 디바이스 화면 세로 모드 고정 실시")
        print("====================================")
        print("")
        // */
        
        // [세로 방향 고정]
        return UIInterfaceOrientationMask.portrait
    }
    // */
    
    
    
    
    
    // MARK: - [애플리케이션 백그라운드 상태 전환 이벤트 감지]
    func applicationDidEnterBackground(_ application: UIApplication) {
        print("")
        print("====================================")
        print("[AppDelegate >> applicationDidEnterBackground]")
        print("-------------------------------")
        print("설 명 :: 애플리케이션 백그라운드 상태 전환 이벤트 감지")
        print("====================================")
        print("")
    }
    
    
} // [클래스 종료]
 

[SceneDelegate : 소스 코드]

import Foundation
import UIKit

class MySceneDelegate: NSObject, UIWindowSceneDelegate {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. UI 딜리게이트 : 커스텀 생성
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [빠른 로직 찾기 : 주석 로직 찾기]
    // -----------------------------------------
    // [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 }
        // -----------------------------------------
        
        
        // -----------------------------------------
        // [사전 : 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("")
    }

    
    
    
    
    // MARK: - [Scene 포그라운드 실행]
    func sceneWillEnterForeground(_ scene: UIScene) {
        print("")
        print("====================================")
        print("[SceneDelegate >> sceneWillEnterForeground]")
        print("-------------------------------")
        print("설 명 :: Scene 포그라운드 실행")
        print("====================================")
        print("")
    }

    
    
    
    
    // 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("")
        
        
        // -----------------------------------------
        // [사전 : info plist : URL Types 에 정의 필요]
        if let _url = URLContexts.first?.url {
            
            // [스키마 접속 처리 핸들러 호출]
            self.schemeHandleURL(url: _url)
        }
        // -----------------------------------------
    }
    
    
    
    
    
    // MARK: - [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("")
        }
        // -----------------------------------------
    }
    
    
} // [클래스 종료]
 

[App : 소스 코드]

 

import SwiftUI

@main // [SwiftUI 앱의 진입점]
struct swiftui_testApp: App {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 앱 구조 : 앱의 콘텐츠와 동작을 설명
    // -----------------------------------------
    2. SwiftUI 앱에는 하나의 기본 앱 구조만 있습니다
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [전역 변수 선언]
    @UIApplicationDelegateAdaptor var delegate: MyAppDelegate // [커스텀 생성 딜리게이트]
    
    
    
    
    // MARK: - [앱의 사용자 인터페이스를 정의하는 뷰 계층 구조가 포함]
    var body: some Scene {
        WindowGroup {
            
            // [ContentView 클래스 뷰 화면 지정]
            ContentView()
        }
    }
    
    
} // [클래스 종료]
 

[View : 소스 코드]

import SwiftUI

struct ContentView: View {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 앱 View : 앱이 사용자 인터페이스로 표시하는 뷰 계층 구조가 포함
    // -----------------------------------------
    2. 실제 사용자에게 표시되는 화면 구성 실시
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [전역 변수 선언]
    
    
    
    
    
    // MARK: - [화면에 표시되는 시각적 요소 정의 실시]
    var body: some View {
        VStack { // [화면 보기를 수직으로 정렬]
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
        }
        .padding()
    }
    
    
} // [클래스 종료]






// MARK: - [화면 프리뷰 : 미리보기 화면 지원]
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
 

[결과 출력]


 

반응형
Comments