Notice
Recent Posts
Recent Comments
Link
투케이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()
}
}
[결과 출력]
반응형
'IOS' 카테고리의 다른 글
Comments