일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리펙토링
- 리팩토링
- clean architecture
- Refactoring
- combine
- collectionview
- 스위프트
- SWIFT
- 리펙터링
- 애니메이션
- UICollectionView
- swiftUI
- tableView
- rxswift
- uiscrollview
- Clean Code
- 클린 코드
- MVVM
- map
- Protocol
- uitableview
- swift documentation
- Observable
- Human interface guide
- HIG
- RxCocoa
- ios
- ribs
- UITextView
- Xcode
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate 본문
[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate
jake-kim 2020. 4. 20. 22:031. iOS12이하 버전 : App하나는 오로지 각각 하나의 Process와 UI를 유지 (AppDelegate에서 모두 관여)
- Process Lifecycle : Process 상태
- UI Lifecycle : active, inactive, background, foreground 상태 관여
2. iOS13이상 버전 : App하나에
여러 UI 인스턴스 존재 가능 (App Delegate가 Session을 관리하므로)
_ : App Delegate
_ : Scene Delegate
call stack : 앱 클릭 ->didFinishLaunchingWithOptions->configurationForSession->willConnectToSession
(아직 화면에는 앱이 안뜬 상태)
-> scene(_:willConnectTo)에서, window = UIWindow(windowScene: scene as! UIWindowScene)
(화면에 앱이 등장)
-> willResignActive, didEnterBackground -> didDisconnect
(앱 화면을 명시적으로 종료할 시 ) -> didDiscardSceneSceneSessions : scene이 didDisconnect됐을 경우(유저의 포커스
에서 벗어난 후 다시 포커스를 받은 경우 데이터를 유지 하기 위해, 이곳에서 복구관련 정보를 획득 == 한 앱을 여러 화면 띄울 수 있음)
3. (Scene) Session LifeCycle
1) Scene Delegate에서 Scene Session이 생성되가나 삭제될 때, AppDelegate에 보고
2) 사용자가 앱을 클릭하면 AppDelegate에 Scene Session을 추가하기 위해 Configuration을 요청
: 일반적으로 정적으로 info.plist에서 작성
* 동적으로 설정하는 방법 - 밑의 메소드에 작성
※ 아직 화면에 보이는 상태는 아님(단순히 AppDeleagate에서 Scene Session을 연결한 것)
3) 화면에 보이게끔 해당 Scene에 window생성
1
2
3
4
5
6
7
8
9
|
// 하나의 씬에 해당되는 윈도우 생성 - 윈도우가 생성되면 화면에 드디어 보이기 시작
self.window = UIWindow(windowScene: scene as! UIWindowScene)
// 객체 생성
let tbc = UITabBarController()
tbc.view.backgroundColor = .white
// 윈도우의 루트 뷰 컨트롤러로 등록
self.window?.rootViewController = tbc
|
= |
cf) scene, window, windowScene
UIWindowScene객체를 이용해서 앱의 UI를 관리함
한 scene은 windows들과 view controller포함하며 하나의 UI의 인스턴스를 표현
각 scene은 UIWindowSceneDelegate객체를 가지고 있음 (각 same memory를 공유하며 동기화)
4. Scene 동기화
1) 기존의 방법 : view 변화 -> ViewController가 감지 -> View에게 알린 후 Model에게 알림
만약, Scene이 여러개인 iOS13에서 이렇게 된다면, 또 다른 View Controller는 갱신안됨
2) 현재의 방법 : view 변화 -> View Controller가 감지 -> Model에 알림 -> Model (Controller)가 다른 View Controller에게 알림
* iOS13에서 iOS12버전 사용하기
- iOS12이하 버전 사용법 출처 : https://velog.io/@dev-lena/iOS-AppDelegate와-SceneDelegate
5. SceneDelegate.swift 생명주기 메서드
1) scene(_: willConnectTo: options:)
scene이 앱에 추가될 때 호출, 단 여기서 ViewController와 같은 클래스 객체를 만들어 사용할 때, 아직 viewDidLoad()가 호출되지 않음
2) sceneDidDisconnect(_:)
scene의 연결이 해제될 때 호출
3) sceneDidBecomeActive(_:)
app switcher에서 선택되는 등 scene과의 상호작용이 시작될때 호출
* app switcher 홈 버튼을 두 번누르거나 아이폰 하단에서 위로 스와이프 했을 때 현재 실행중인 앱들이 보이는 화면
4) sceneWillResignActive(_:)
사용자가 scene과의 상호작용을 중지할 때 호출(다른 화면으로의 전환과 같은 경우)
5) sceneWillEnterForeground(_:)
scene이 foreground로 진입할 때 호출
6) sceneDidBackground(_:)
scene이 background로 진입할 때 호출
cf) AppDelegate.swift
- process변화에 호출 (SceneDelegate는 UI적인 요소 담당)
//애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
//애플리케이션이 최초 실행될 때 호출되는 메소드
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
//애플리케이션이 InActive 상태로 전환되기 직전에 호출
func applicationWillResignActive(_ application: UIApplication)
//애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)
//애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출
func applicationWillEnterForeground(_ application: UIApplication)
//애플리케이션이 Active 상태로 전환된 직후 호출
func applicationDidBecomeActive(_ application: UIApplication)
//애플리케이션이 종료되기 직전에 호출
func applicationWillTerminate(_ application: UIApplication)
'Git, CocoaPods, Xcode, Shell' 카테고리의 다른 글
[iOS - swift] 자신만의 framework 생성 & 사용 (0) | 2020.04.24 |
---|---|
[iOS - swift] CocoaPods 패키지 관리 도구 (0) | 2020.04.24 |
[iOS - storyboard표현] @IBDesignable, @IBInspectable (0) | 2020.04.18 |
[iOS - 폰트 설정] (0) | 2020.04.17 |
[iOS - 앱 icon 및 이름 설정] 저작권 없는 무료 이미지, 무료 아이콘, iOS 앱 아이콘 형식 변환 (0) | 2020.04.16 |