일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- @Binding
- URL(string:)
- NavigationLink
- subject
- Xcode
- SwiftUI
- IOS
- init?
- graphql
- SWIFT
- typeorm
- @State
- Creating Operators
- nonisolated
- nestjs
- init
- Bug
- @Environment
- RFC1738/1808
- NullObject
- RxSwift
- Operators
- RxCocoa
- vim
- @EnvironmentObject
- ios14
- swift6
- Operater
- operator
- dismiss
- Today
- Total
Tunko Development Diary
[iOS][swiftUI] iOS13에서 분할된 AppDelegate와 추가된SceneDelegate이해하기 본문
[iOS][swiftUI] iOS13에서 분할된 AppDelegate와 추가된SceneDelegate이해하기
Tunko 2021. 2. 13. 21:20결론
SceneDelegate는 기존 AppDelegate에서 총괄하던 기능이 분리된것입니다.
AppDelegate는 앱시작과 같은 애플리케이션 수준 이벤트 처리
SceneDelegate는 UISceneSession의 장면 생성, 파괴 및 상태 복원과 같은 장면의 생명주기 이벤트를 담당합니다.
2021.2.13
iOS14가 나온 시점에서 이글을 작성합니다.
신규 프로젝트 생성시 SceneDelegate.swift 파일이 프로젝트에 생성되지 않았습니다.
SceneDelegate.swift 가 자동으로 생성되려면 Life Cycle을 UIKit App Delegate 로 설정한뒤 프로젝트를 생성해야 합니다.
iOS13 부터 등장한 SceneDelegate
기존 AppDelegate 에서는 애플리케이션 실행과 앱 포 그라운드 및 백그라운드 로직이 처리되는 곳이였습니다.
하지만 iOS13 부터는 AppDelegate의 역할은 AppDelegate와 SceneDelegate간에 분할되었습니다.
분할의 이유
iPad-OS 에 도입된 새로운 다중 창 지원기능이 적용된 결과입니다.
그결과 AppDelegate의 작업을 두개로 분할합니다.
AppDelegate는 애플리케이션 life Cycle 및 설정을 담당합니다.
SceneDelegate는 화면 (Windows 또는 Scenes)에 표시되는 내용을 처리하고 앱이 표시되는 방식을 관리합니다.
기존 AppDelegate에서 담당하던 기능
푸시알림 등록, 위치 서비스, 앱종료 등과 같은 외부 서비스는 기존과 같이 계속 처리할 수 있습니다.
func application (_ : didFinishLaunchingWithOptions :)-> Bool
앱 시작시 앱 설정이 완료될때 호출됩니다.
iOS13 이전에는 이 메서드를 통해 UIWindow 개체를 구성하고 ViewController인스턴스를 할당합니다.
하지만,
iOS13 부터 애플리케이션에 장면이 있는 경우 AppDelegate는 더이상 이를 처리할 책임이 없고 SceneDelegate로 이동됩니다.
func application (_ : configurationForConnecting : options :)-> UISceneConfiguration
새 장면이나 새창이 필요할 때마다 호출됩니다.
이 메서드는 앱 시작시 호출되지 않고 새 장면 또는 새 창을 가져야 하는 경우에만 호출됩니다.
func application (_ : didDiscardSceneSessions :)
멀티 태스킹 창에서 스와이프 하는것과 같이 장면을 삭제할 때 또는 프로그래밍 방식으로 앱 제거시 호출됩니다.
SceneDelegate
AppDelegate의 UIWindow와 관련된 것은 이제 SceneDelegate의 UIScene입니다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
UI창을 만들고 root view controller 를 설정하고
설정한 창을 ‘키’ 창으로 만듭니다.
키창으로 만든다라는 말이 무슨말인지 좀더 자세히 알아보기 위해 해당 링크를 첨부합니다.
Apple Developer Documentation
“설정한 창을 ‘키’ 창으로 만듭니다.”
=> 같은 수준 이하의 다른 모든 창앞에 해당 창을 배치합니다.
func sceneDidDisconnect(_ scene: UIScene)
앱에 Scene이 백그라운드로 전환시마다 iOS 에서는 리소스를 확보하기위해 Scene를 완전 폐기할지 결정할 수 있다.
이것은 앱이 종료되거나 실행되지 않음을 의미하진 않지만 Scene만 Session에서 연결해제되고 활성화 되지 않습니다.
iOS에선 사용자가 특정 Scene을 포그라운드로 전환시 세션에 다시 연결하도록 결정 할 수 있습니다.
이 메서드는 사용하지 않는 리소스를 삭제하는데도 사용할 수 있습니다.
func sceneDidBecomeActive(_ scene: UIScene)
WillEnterForeground 메서드 다음에 호출된다. 장면이 설정되고 표시할 준비가 되었음을 알려준다.
func sceneWillResignActive(_ scene: UIScene)
앱이 백그라운드로 전환시 실행된다.
func sceneWillEnterForeground(_ scene: UIScene)
백그라운드에서 포그라운드로 전환시 실행
func sceneDidEnterBackground(_ scene: UIScene)
백그라운드에서 포그라운드로 전환시 실행
sceneWillEnterForeground 이후에 실행됨.
SceneDelegate 파일에서 가장 중요한 메서드!
새로운 화면 객체가 앱에 추가 될 때마다 호출된다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
- ContentView 인스턴스 생성
- 새로운 UIWindow 객체 생성
- UIHostingController 인스턴스에 ContentView 객체 포함
- UIHostingController를 새롭게 생성된 UIWindow 객체의 최상위 뷰 컨트롤러(root view Controller) 로 할당
- 화면의 현재 UIWIndow 인스턴스를 새로운 화면 인스턴스로 치환
- 사용자에게 윈도우 표시
iOS13 에서 다중윈도우가 지원되면서 여러 개의 사용자 인터페이스 인스턴스로 앱을 구성할 수 있게 되었다.
아이폰에서 사용자는 App switcher를 이용하여 사용자 인터페이스 복사본들 간의 전환을 하며, 아이패드에서도 사용자 인터페이스의 복사본이 나란히 표시된다.
여러 화면 모두는 동일한 UIApplication 객체를 공유하지만 다중 윈도우 구성에서의 각UIWindowScene인스턴스는 자신만의 화면 델리게이트 인스턴스를 갖는다.
SceneDelegate.swift파일은 UIWindowSceneDelegate 프로토콜을 구현하여, 현재 세션과 연결되는 새로운 화면 객체, 백그라운드와 포그라운드 간의 화면전환, 또는 앱에서 연결이 끊긴 화면과 같은 이벤트를 처리하는 메서드를 포함한다.
SceneDelegate의 모든 메서드는 앱의 생명주기 동안 초기화와 초기화 해제 작업을 수행하는데 유용하다.
하지만, 이 파일에서 가장 궁요한 델리게이트 메서드는 새로운 화면 객체가 앱에 추가 될 때마다 호출되는 willConnectTo메서드다.
디폴트로, Xcode에 의해 구현되는 willConnectTo 델리게이트 메서드는 ContentView.swift 파일에 선언된 ContentView의 인스턴스를 생성하고 사용자에게 보이도록 한다. 이 메서드 내에서 UIKit 아케텍처와 SwiftUI 간의 간격이 해소된다.
UIKit 프로젝트 내에SwiftUI 뷰가 포함되기 위해서 SwiftUI뷰는 UIHostingController 인스턴스에 포함된다.
참조 도서 : 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍
참조 블로그 : https://medium.com/@kalyan.parise/understanding-scene-delegate-app-delegate-7503d48c5445
'Development > iOS 개발' 카테고리의 다른 글
[iOS14][SwfitUI] SwiftUI2 life cycle 에서 딥링크 처리 (0) | 2021.02.14 |
---|---|
[iOS14][SwfitUI] SwiftUI2 App life cycle 정리 (0) | 2021.02.14 |
[iOS][swift]NavigattionBar 하단 라인 지우기 (0) | 2021.02.13 |
[iOS][swift] App Version 가져오기 (0) | 2021.02.13 |
[iOS][swift] UITextFile 이모티콘 입력 막기 (정규식 사용) (0) | 2021.02.13 |