개요
- iOS 13이상에서는 유저가 앱UI의 여러 인스턴스를 동시에 만들고 관리 할 수 있으며, app switcher를 통해 전환도 할 수 있습니다.
app Switcher란 홈버튼 더블클릭, 인디케이터바를 위로 스와이프 해서 나오는 화면을 말합니다.
- iPad에서는 유저가 여러개의 인스턴스를 나란히 표시 할 수도 있습니다. UI의 각 인스턴스마다 다른내용, 다른방식으로 표시됩니다. 예를 들어 캘린더 앱은 특정 날짜와 특정 달에 대한 약속을 동시에 보여줄수 있습니다.
- 이전에는 한 앱을 동시에 켜는 것이 불가능 하였습니다.
- UIkit은 UIWindowScene객체를 이용하여 앱 UI의 각 인스턴스를 관리합니다.
- Scene에는 UI의 한 인스턴스를 표시하는데 필요한 windows와 view controllers가 있습니다.
- 각 scene에는 해당 UIWindowSceneDelegate 객체도 있으며 이 객체를 사용하여 모든 scene과 인터렉션들을 관리합니다.
scene이 동일한 메모리, 프로세스공간에서 동시에 실행되기 때문에, 한 앱에서 동시에 활성화 되는 scene과 scene delegate가 여러개 있을수 있습니다.
Managing Your App's Life Cycle
- 앱이 foreground나 background에 있을때 시스템 관련 이벤트를 처리합니다.
개요
- 앱의 현재 상태에 따라 언제든지 수행 할 수 있는 작업과, 수행 할 수 없는 작업이 결정됩니다.
- 예를들어 foreground앱은 유저가 보고 있는 화면이기에 CPU를 비롯한 시스템 리소스 우선순위가 높습니다.
- 하지만 background앱은 가능한 작은 작업을 해야하며, 화면이 안보이기에 아무것도 하지않는것이 좋습니다.
- 앱 상태가 바뀌면 그에 따라 행동을 바꾸어야 합니다.
- 앱의 상태가 바뀌면 UIKit은 적절한 delegate메소드를 호출하여 사용자에게 알려줍니다.
- iOS 13 이상에서는 UISceneDelegate를 사용하여 Scene기반 라이프사이클이 동작합니다.
- iOS 12 이하에서는 UIApplicationDelegate에서 동작합니다.
앱에서 scene support 를 설정하면 iOS 13이상에서는 scenedelegate를 항상 사용합니다. iOS12이전 버전은 app delegate를 사용합니다.
앱 기반 라이프 사이클 이벤트에 응답 (Respond to App-Based Life-Cycle Events)
- iOS12이전 버전이나 Scene을 지원하지 않는 앱에서 UIKit은 모든 라이플 사이클 이벤트를 UIApplicationDelegate로 전달합니다.
- App delegate는 별도의 화면에 표시된 창을 포함하여 모든 앱의 창을 관리합니다.
- 따라서 앱상태 전환은 앱의 전체 UI에 영향을 줍니다.
- 아래 그림은 App delegate와 관련된 상태 전환을 보여줍니다.
- 실행 후 UI가 화면에 표시 될지 여부에 따라서 시스템이 앱을 비활성 상태 또는 백그라운드 상태로 전환합니다.
- 포 그라운드로 시작할 때 시스템은 앱을 자동으로 활성 상태로 전환합니다.
- 그 후에 상태는 앱이 종료 될 때까지 활성/비활성/백그라운드 로만 변합니다.
Scene 기반 라이프 사이클 이벤트에 응답 (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은 이를 생성하고 연결되지 않은 상태로 둡니다. (Unattached)
- 유저가 요청한 scene은 빠르게 foreground로 이동하여 화면에 나타납니다.
- 시스템이 요청한 scene은 background로 이동하여 이벤트를 처리합니다.
- 예를들어 시스템은 백그라운드에서 scene을 실행하여 location 이벤트를 처리할 수 있습니다.
- 유저가 앱을 닫으면 UIKit은 관련 scene을 백그라운드 상태로 이동하고 결국 suspended 됩니다.
- UIKit은 리소스를 회수하기 위해 background나 suspended된 scene의 연결을 끊고 연결되지 않은 상태로 반환합니다.
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개의 차이점들에 대한 궁금증이 해결될 것 같습니다.
앱이 지원하는 Scene 지정하기 (Specifying the Scenes Your App Supports)
개요
- iOS13이상에서는 유저가 앱 UI를 복사하여 App swicher로 전환할 수 있습니다.
- iPad에서는 앱UI를 복사하여 동시에 표시 할 수 도 있습니다.
- 앱의 각 UI에 대해 scene개체를 이용하여 화면에 UI를 표시하는 Window, view, viewController를 관리합니다.
- 유저가 새 scene을 요청하면 UIKit은 해당 scene 개체를 만들고 init을 합니다.
- 이를 위해 UIKit은 유저가 제공하는 정보에 의존합니다.
- 앱은 지원하는 scene타입과, 관리하는데 사용하는 객체를 선언해야 합니다.
- 앱의 Info.plist에서 정적 또는 런타임에 동적으로 수행 할 수 있습니다.
프로젝트 설정에서 Scene 지원 활성화
- 설정을 이용하여 scene 사용을 선택해야 합니다.
- Xcode 프로젝트를 엽니다.
- 앱 타겟의 General로 이동합니다.
- 배포 섹션에서 Supports multiple windows를 체크합니다.
- 위와 같이 하면 Xcode에서 UIApplicationSceneManifest키를 앱의 Info.plist 파일에 추가합니다.
- 이 키가 있으면 앱이 Scene을 지원함을 시스템에 알립니다.
- Xcode는 기본적으로 이값을 true로 설정하지만 비활성화하여 한번에 하나의 scene만 보이도록 할 수 있습니다.
- 여러 scene을 지원하려면 scene 별로 서로 간섭하지 않도록 작업해야합니다.
예를들어, scene에서 동일한 공유 데이터를 사용하는 경우 해당 구조에 대한 접근을 바꾸어 앱 데이터의 무결성을 유지해야합니다.
각 Scene에 대한 세부 정보 구성
- UIKit은 유저가 제공한 정보를 이용하여 앱 scene을 만듭니다.
- 이 정보를 제공하는 가장 간단한 방법은 앱의 Info.plist에 있습니다.
- Info.plist를 선택하세요.
- Application Scene Manifest항목의 + 버튼을 클릭하세요.
- 이 항목은 UIApplicationSceneMesifest키에 존재 합니다. 없다면 위에서 설명한 방식대로 scene support를 먼저 해주세요.
- 나타나는 메뉴에서 scene Configuration을 선택하세요.
- Scene Configuration에서 +버튼을 누르세요.
- Application Session Role을 선택하여 기본 화면을 추가하세요.
- 세부정보를 채웁니다.
자세한 내용은 UISceneConfigurations를 확인해주세요.
Scene에 대한 인터페이스 만들기
- 스토리보드를 사용하여 scene의 UI를 지정합니다.
- UISceneStoryboardFile키에 할당한(위의 scene Configuration에서 할당) 스토리보드에는 scene에 표시할 viewController가 있습니다.
- Scene 객체를 만드는 것 외에도 UIKit은 Scene에 대한 window를 자동으로 만들고 스토리보드의 초기 뷰컨트롤러를 이 윈도우에 올립니다.
- UIWindowSceneDlegate개체의 메서드를 사용하여 동적으로 해당 scene의 뷰 컨트롤러를 바꿀수 있습니다.
storyboard에서 initial view controller를 꼭 지정해야합니다.
Scene의 구성을 동적으로 변경하기
- UIKit은 Scene을 실제로 만들기 전에 app delegate의 application(_:configurationForConnecting:options:)를 호출하여 scene관련 세부사항을 변경할 수 있게 합니다.
- 이 메서드를 사용하여 UIKit에서 제공하는 옵션을 기반으로 scene을 바꿀수 있습니다.
- 예를들어, 시스템이 scene에 알림을 전달하면 알림 관련 인터페이스로 다른 스토리보드를 지정할 수 있습니다.
- scene을 동적으로 구현하지 않으면 UIKit은 앱의 Info.plist파일에 있는 정보로 scene을 만듭니다.
Scene 기반 라이프사이클 sementics 채택 (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에 전달합니다.
Managing Your App's Life Cycle | Apple Developer Documentation
- 앱의 라이프 사이클을 관리하고 여러개의 UI인스턴스 생성에 반응합니다.
댓글