아래의 글은 WWDC 19: Architecting Your App for Multiple Windows의 일부분을 보고 번역하며 정리한 글 입니다😊
1. Changes to app lifecycle
- iOS12 이전의 App Delegate 역할
- 어플에 Process Level Events에 대해 알리기 : 그래서 시스템이 내 App Delegate에게 내 프로세스가 런칭하던지 끝날때를 알릴 수 있도록
→ App Launched, App Terminated
- 앱에게 UI 상태를 알려주는 것
→ Entered Foreground, Became Active
→ 이때는 한 process가 있고 이에 매치되는 단 하나의 user interface instance가 있었기 때문에 ㄱㅊ았음
- AppDelegate - DidFinishLaunching에서 one-time non-UI global Setup(setup database, initializing data structure), setup UI를 주로 했었음
- 하지만 iOS 13부터는 유효하지 않음 → 현재는 동일하게 하나의 process를 가지고 있는 것은 맞지만 여러 개의 UI Instances나 scene session들을 가지고 있을 수 있기 때문에 → App Delegate의 responsibility가 조금 바껴야한다는 뜻임
- 이전과 동일하게 Process Events, Life Cycle에 책임이 있는 것은 맞지만 이제는 더이상 UI Lifecycle에는 책임이 없다는 뜻임. → 이 부분은 이제 UIScene Delegate가 책임짐
App Delegate : iOS 12까지는 이 부분이 process event, life cycle, UI lifecycle 모두 책임졌음
→ 하지만 iOS 13부터는 이 부분이 App Delegate / Scene Delegate 두 개로 쪼개짐
Scene Delegate : 이제 UI Lifecycle과 관련된 부분은 이 코드에서 처리해줘야함(Entered Foreground, Became Active)
App Delegate의 UI Lifecycle 관련 코드와 Scene Delegate의 코드는 1대1 대응이 되기 때문에 migrate만 시켜주면 됨!!
- 추가적으로 iOS 13에서는 App Delegate가 새로운 책임을 맡게 되는데 이는
Session Lifecycle
임(notify when a new Scene Session is being created or an exisiting Scene Session is being discarded)
2. Using the scene delegate
- Launch an app for the first time
App Delegate
- DidFinishLaunching : one-time non-UI setup 실행해도 ㄱㅊ음 이 단계에서
- configurationForSession : 진짜 UI Scene을 만들기 전에 먼저 씬을 어떤 SceneDelegate, 어떤 Storyboard, (만약에 지정한 경우) 어떤 scene subclass를 사용해서 Scene을 만들건지 지정해줌!!
→ 이러한 Scene Configuration은 코드에서 동적으로 정의하거나 info.plist에서 정적으로 정의할 수 있음
→ Scene Session은 생성이됨~ 하지만 아직 UI가 안보임 → Scene Delegate에서 생성해줘야함
Scene Delegate
-
WillConnectToSession: 여기서 새롭게 지정된 UI Window Initializer를 사용하여 UI Window를 setup해주는 단계임 + window를 구성하는데 관련된 사용자 activity나 상태(state) restoration activity가 있는지 확인해야함
-
willResignActive, didEnterBackground
-
didDisconnect(Scene Disconnection) : System is releasing the scene. maybe called any time. release associated resources. this scene may return!
→ Scene이 disconnected 되면 해당 Scene configuration도 메모리에서 released되고 관련 window hierarchies / view hierarchies 모두 released 됨
→ 이는 해당 scene과 연관되어 앱 어딘가에 저장돼있던 메모리 중 대용량 리소를 할당 취소하고 해제할 수 있는 기회라는 뜻.
→ 하지만 scene은 나중에 다시 연결되고 return 할 수 있기 때문에 any user dadta or state를 영구 삭제하는데 사용하면 안됨
App Delegate
- didDiscardSceneSession: 여기서는 이제 영구적으로 해당 씬과 관련된 user state, data를 지워도 됨. (ex. unsaved draft in a text editing app)
- 실제로 App Process is not running인데 사용자가 remove UIScene할 수도 있음.
→ 그러면 discarded session에 대해 시스템이 계속 추적하다가 앱의 다음 launch때 이를 실행시킴
3. Architecture
- State Restoration : 앱을 한 4개정도 띄워놓고 두개에서 계속 작업하다가 나머지 두 개 중 하나의 앱으로 돌아갔는데 내가 작업하던 내역이 다 날아가있는 것은 great한 user experience가 아님
- iOS 13에는 이를 위한 scene-based state restoration API가 있음. 이는 NSUserActivity를 기반으로 작동함.
- Scene Delegate에 State Restoration Activity를 삽입시키고 현재 window에서 가장 활발하고 관련있는 user activity form을 찾는 method를 실행시킴 그리고 그걸 return 해줌
- 그러면 나중에 foreground 상태에 re-enter하고 다시 connected되면 session이 state restoration activity가 있는지 확인하고 있으면 그 activity를 사용해서 window를 다시 구성해주면 됨. 만약에 없으면 그냥 brand new window를 보여주면 되고....