App and Scenes

앱의 라이프 사이클을 관리하고 여러개의 UI인스턴스 생성에 반응합니다.

Overview

iOS 13이상에서는 유저가 앱UI의 여러 인스턴스를 동시에 만들고 관리 할 수 있으며, app switcher를 통해 전환도 할 수 있습니다.
app Switcher란 홈버튼 더블클릭, 인디케이터바를 위로 스와이프 해서 나오는 화면을 말합니다.
iPad에서는 유저가 여러개의 인스턴스를 나란히 표시 할 수도 있습니다. UI의 각 인스턴스마다 다른내용, 다른방식으로 표시됩니다. 예를 들어 캘린더 앱은 특정 날짜와 특정 달에 대한 약속을 동시에 보여줄수 있습니다. 아래 이미지에선 노트앱의 각기 다른 메모들을 보여주고 있습니다.
이전에는 한 앱을 동시에 키는것이 불가능 하였습니다.
[##Image|kage@4ptuR/btqvPMZ1BxB/ZhmDBSnmfFhnmMKFr1pR30/img.png|alignCenter|width="1252" height="704" data-origin-width="1280" data-origin-height="719" data-ke-mobilestyle="widthContent"|||##]
UIkit은 UIWindowScene객체를 이용하여 앱 UI의 각 인스턴스를 관리합니다. Scene에는 UI의 한 인스턴스를 표시하는데 필요한 windows와 view controllers가 있습니다. 각 scene에는 해당 UIWindowSceneDelegate 객체도 있으며 이 객체를 사용하여 모든 scene과 인터렉션들을 관리합니다. scene이 동일한 메모리, 프로세스공간에서 동시에 실행되기 때문에, 한 앱에서 동시에 활성화 되는 scene과 scene delegate가 여러개 있을수 있습니다.

Managing Your App's Life Cycle

앱이 foreground나 background에 있을때 시스템 관련 이벤트를 처리합니다.

Overview

앱의 현재 상태에 따라 언제든지 수행 할 수 있는 작업과, 수행 할 수 없는 작업이 결정됩니다. 예를들어 foreground앱은 유저가 보고 있는 화면이기에 CPU를 비롯한 시스템 리소스 우선순위가 높습니다. 하지만 background앱은 가능한 작은 작업을 해야하며, 화면이 안보이기에 아무것도 하지않는것이 좋습니다. 앱 상태가 바뀌면 그에 따라 행동을 바꾸어야 합니다.
앱의 상태가 바뀌면 UIKit은 적절한 delegate메소드를 호출하여 사용자에게 알려줍니다.
iOS 13이상에서는 UISceneDelegate를 사용하여 Scene기반 라이프사이클이 동작합니다.
iOS 12이하에서는 UIApplicationDelegate에서 동작합니다.
앱에서 scene support 를 설정하면 iOS 13이상에서는 scenedelegate를 항상 사용합니다. iOS12이전 버전은 app delegate를 사용합니다.
먼저 가이드 문서와는 다르게 저희는 익숙한 AppDelegate부터 살펴보겠습니다.

Respond to App-Based Life-Cycle Events

iOS12이전 버전이나 Scene을 지원하지 않는 앱에서 UIKit은 모든 라이플 사이클 이벤트를 UIApplicationDelegate로 전달합니다. App delegate는 별도의 화면에 표시된 창을 포함하여 모든 앱의 창을 관리합니다. 따라서 앱상태 전환은 앱의 전체 UI에 영향을 줍니다. 아래 그림은 App delegate와 관련된 상태 전환을 보여줍니다. 실행 후 UI가 화면에 표시 될지 여부에 따라서 시스템이 앱을 비활성 상태 또는 백그라운드 상태로 전환합니다. 포 그라운드로 시작할 때 시스템은 앱을 자동으로 활성 상태로 전환합니다. 그 후에 상태는 앱이 종료 될 때까지 활성. 비활성 백그라운드로만 변합니다.
[##Image|kage@mEdMJ/btqvR46exai/nIdC3odn3Dnr0nU23OCnA0/img.png|alignCenter|width="647" height="748" data-origin-width="784" data-origin-height="905" data-ke-mobilestyle="widthContent"|||##]

Respond to Scene-Based Life-Cycle Events

앱이 scene을 지원하면 UIKit은 각각에 대해 별도 라이프 사이클을 제공합니다. scene은 기기에서 실행중인 앱 UI의 한 인스턴스를 나타냅니다. 유저는 각 앱에 대해 여러 scene을 만들고 이를 개별적으로 표시하거나 숨길 수 있습니다. 각 scene마다 고유한 라이프사이클이 있기때문에 각 scene마다 다른 실행 상태가 될 수 있습니다. 예를들어 한 scene이 foreground에 잇고, 다른 scene은 background에 있거나 suspended되었을 수 있습니다.
Scene은 선택적 기능입니다. Scene support를 키고 끄는법은 아래 Specifying the Scenes Your App Supports에서 다루겠습니다.
아래 그림은 scene의 상태 전환을 보여줍니다. 유저나 시스템이 앱의 새로운 scene을 요청하면 UIKit은 이를 생성하고 연결되지 않은 상태로 둡니다. 유저가 요청한 scene은 빠르게 foreground로 이동하여 화면에 나타납니다. 시스템이 요청 scene은 background로 이동하여 이벤트를 처리합니다. 예를들어 시스템은 백그라운드에서 scene을 실행하여 location이벤트를 처리할 수 있습니다. 유저가 앱을 닫으면 UIKit은 관련 scene을 백그라운드 상태로 이동하고 결국 suspended됩니다. UIKit은 리소스를 회수하기 위해 background나 suspended된 scene의 연결을 끊고 연결되지 않은 상태로 반환합니다.
[##Image|kage@qu1wo/btqvQEmRbsK/Yr0pISMfw56YNuZ17EdqO0/img.png|alignCenter|width="702" height="748" data-origin-width="855" data-origin-height="911" data-ke-mobilestyle="widthContent"|||##]
App delegate와의 차이점
background에서만 Unattached가 됩니다. Appdelegate는 suspended나 background상태에서 not running 상태가 될 수 있었는데 Scenedelegate에서는 Background에서만 Unattached가 됩니다. unattached가 되려면 suspended에서 background가 된 다음 unattached가 되어야 하나 봅니다.
Scene delegate에서는 Suspended에서 바로 Inaction로 가는 화살표도 사라졌습니다.
Scene delegate에서 inactive에서 active가 될때 Unattached에서 inactive를 거쳐 active가 될때 점선으로 바뀌었습니다.
Scene delegate에서 Unattached에서 background가 될때 실선입니다.
여기서 말하는 실선 점선의 뜻이 아직 명확하지가 않아서 먼저 파악부터 해보면 이 4개의 차이점들에 대한 궁금증이 해결될것 같습니다.

Specifying the Scenes Your App Supports

Overview

iOS13이상에서는 유저가 앱 UI를 복사하여 App swicher로 전환할 수 있습니다. iPad에서는 앱UI를 복사하여 동시에 표시 할 수 도 있습니다. 앱의 각 UI에 대해 scene개체를 이용하여 화면에 UI를 표시하는 Window, view, viewController를 관리합니다. 유저가 새 scene을 요청하면 UIKit은 해당 scene 개체를 만들고 init을 합니다. 이를 위해 UIKit은 유저가 제공하는 정보에 의존합니다. 앱은 지원하는 scene타입과, 관리하는데 사용하는 객체를 선언해야 합니다. 앱의 Info.plist에서 정적또는 런타임에 동적으로 수행 할 수 있습니다.

Enable Scene Support in Your Project Settings

앱 설정을 이용하여 scene 사용을 선택해야 합니다.
Xcode프로젝트를 엽니다.
앱 타겟의 General로 이동합니다.
배포 섹션에서 Supports multiple windows를 체크합니다.
위와 같이 하면 Xcode에서 UIApplicationSceneManifest키를 앱의 Info.plist파일에 추가합니다. 이 키가 있으면 앱이 Scene을 지원함을 시스템에 알립니다. Xcode는 기본적으로 이값을 true로 설정하지만 비활성화하여 한번에 하나의 scene만 보이도록 할 수 있습니다. 여러 scene을 지원하려면 scene별로 서로 간섭하지 않도록 작업해야합니다. 예를들어, scene에서 동일한 공유 데이터를 사용하는 경우 해당 구조에 대한 접근을 바꾸어 앱 데이터의 무결성을 유지해야합니다.

Configure the Details for Each Scene

UIKit은 유저가 제공한 정보를 이용하여 앱 scene을 만듭니다. 이 정보를 제공하는 가장 간단한 방법은 앱의 Info.plist에 있습니다.
Info.plist를 선택하세요.
Application Scene Manifest항목의 + 버튼을 클릭하세요. 이 항목은 UIApplicationSceneMesifest키에 존재 합니다. 없다면 위에서 설명한 방식대로 scene support를 먼저 해주세요.
나타나는 메뉴에서 scene Configuration을 선택하세요.
Scene Configuration에서 +버튼을 누르세요.
Application Session Role을 선택하여 기본 화면을 추가하세요.
세부정보를 채웁니다.
자세한 내용은UISceneConfigurations를 확인해주세요.

Create the Interface for Your Scene

스토리보드를 사용하여 scene의 UI를 지정합니다. UISceneStoryboardFile키에 할당한 (위의 scene Configuration에서 할당)스토리보드에는 scene에 표시할 viewController가 있습니다. Scene객체를 만드는것 외에도 UIKit은 Scene에 대한 window를 자동으로 만들고 스토리보드의 초기 뷰컨트롤러를 이 윈도우에 올립니다. UIWindowSceneDlegate개체의 메서드를 사용하여 동적으로 해당 scene의 뷰 컨트롤러를 바꿀수 있습니다.
storyboard에서 initial view controller를 꼭 지정해야합니다.

Change Your Scene’s Configuration Dynamically

UIKit은 Scene을 실제로 만들기 전에 app delegate의 application(\_:configurationForConnecting:options:)를 호출하여 scene관련 세부사항을 변경할 수 있게 합니다. 이 메서드를 사용하여 UIKit에서 제공하는 옵션을 기반으로 scene을 바꿀수 있습니다. 예를들어, 시스템이 scene에 알림을 전달하면 알림 관련 인터페이스로 다른 스토리보드를 지정할 수 있습니다. scene을 동적으로 구현하지 않으면 UIKit은 앱의 Info.plist파일에 있는 정보로 scene을 만듭니다.

Adopt Scene-Based Life-Cycle Semantics

scene support를 하면 앱의 라이플 사이클방식이 변경됩니다. scene이 없는 앱에서 application delegate는 foreground또는 background로 전환하지만, scene support를 켜면 UIKit은 Scene delegate에서 처리하도록 합니다. scene 라이프 사이클은 서로 독립적이며 앱과도 독립적이므로 scene delegate가 화면 전환을 처리해야 합니다. 앱이 iOS12도 지원하는 경우 Application delegate와 scene delegate 둘다에서 전환을 처리해야합니다. iOS13이상에서는 Scene delegate에 전달하고, iOS12이하에서는 App Delegate에 전달합니다.

UISceneDelegate 라이프 사이클

아래들은 다음에 살펴보겠습니다.
Connecting and Disconnecting the Scene
Tells the delegate about the addition of a scene to the app.
Tells the delegate that UIKit removed a scene from your app.
A data object containing information about the reasons why UIKit created the scene.
Transitioning to the Foreground
Tells the delegate that the scene is about to begin running in the foreground and become visible to the user.
Tells the delegate that the scene became active and is now responding to user events.
Transitioning to the Background
Tells the delegate that the scene is about to resign the active state and stop responding to user events.
Tells the delegate that the scene is running in the background and is no longer onscreen.
Opening URLs
Asks the delegate to open one or more URLs.
An object containing the information needed to open a single URL.
Continuing User Activities
Tells the delegate that it is about to receive Handoff-related data.
Tells the delegate to handle the specified Handoff-related activity.
Tells the delegate that the activity could not be continued.
Saving the State of the Scene
Returns a user activity object encapsulating the current state of the specified scene.
Tells the delegate that the specified activity object was updated.