UIKit - App and Environment - Managing Your App's Life Cycle UIKit


Managing Your App's Life Cycle

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle?language=objc

앱이 포어그라운드 나 백그라운드에 있을 때 시스템 알림에 반응하고 다른 시스템 연관 이벤트를 처리한다.

오버뷰

앱의 현 상태를 통해 현재 할 수 있는 지 할 수 없는 지를 결정한다. 예를 들어, 포어그라운드 앱은 사용자가 보고 있는 앱이므로 CPU를 포함한 시스템 리소스에 우선권을 갖는다. 이에 반해, 백그라운드 앱은 반드시 가급적 적은양만을 수행해야 하며, 하지 않는 것이 좋다. 왜냐하면 오프스크린이기 때문이다. 상태에서 상태로 변함으로서 반드시 이런 작용을 적절히 수행해야 한다.

앱의 상태가 변화할 때, UIKit은 적절한 델리게이트 객체의 메소드를 호출함으로서 알린다.
- iOS 13이후, UISceneDelegate 객체를 사용하여 씬 기반 앱의 라이프 사이클 이벤트에 반응한다.
- iOS 12 이전, UIApplicationDelegate 객체를 사용하여 라이프 사이클 이벤트에 반응한다.

일러두기
앱에 씬 지원을 추가하면 iOS는 언제나 씬 델리게이트를 사용한다. iOS 12이전은 앱델리게이트를 사용한다.

씬 기반 라이프 사이클 이벤트에 반응하기

만약 앱이 씬을 지원하면 UIKit은 각각에 라이프 사이클 이벤트를 전달한다. 씬은 장치에서 구동중인 앱의 UI의 한 인스턴스이다. 사용자는 각 앱에 대한 다중 씬을 생성하고 이들을 분리하여 보이고 감춘다. 각 씬이 자체적인 라이프 사이클을 가지므로 각각은 실행의 다른 상태를 가질 수 있다. 예를 들어, 한 씬은 포어그라운드라면 다른 것은 백그라운드거나 멈춘 상태이다.

중요
씬 지원은 옵트 인 기능이다. 이 기본 지원ㅇ르 활성화 하려면 앱이 지원하는 씬을 지정 부분에서 설명된 것 처럼 Info.plist  파일에 UIApplicationSceneManifest키를 추가한다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports?language=objc

다음 그림은 씬의 상태 전이를 보여준다. 사용자나 시스템이 앱에 대한 새로운 씬을 요청할 때, UIKit은 이를 생성하고 붙여지지 않은 상태로 넣는다. 사용자 요청 씬은 빠르게 포어그라운드로 이동하며 온스크린에 보여진다. 시스템요청 씬은 보통 백그라운드로 가며 이벤트를 처리한다. 예를 들어, 시스템은 백그라운드 내에서 씬을 실행하여 위치 이벤트를 처리한다. 사용자가 앱의 UI를 닫으면, UIKit은 백그라운드 상태로 이동하고 일시정지 상태로 만든다. UIKit은 백그라운드나 중지된 씬과는 교신을 언제든 끊을 수 있으며 씬이 붙여지지 않은 상태로 되돌아 올때 리소스를 다시 요청할 수 있게 한다.

An illustration showing the state transitions for a scene-based app. Scenes start in the unattached state and move to the foreground-active or background state. The foreground-inactive state acts as a transition state.


씬 트랜지션을 사용하여 다음 작업을 수행한다.
- UIKit이 앱의 장면과 연결할 때, 씬의 초기 UI를 설정하고 씬이 필요로하는 데이터를 로드한다.
- 포어그라운드 활성상태로 전이 될 때, UI를 설정하고 사용자와 상호작용할 준비를 한다. 포어그라운드에서 UI를 실행하기 위한 준비하기를 살펴본다. 
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground?language=objc
- 포어그라운드 활성 상태에서 떠날 때 데이터를 저장하고 앱의 작용을 없앤다. 백그라운드에서 UI를 실행하기 위한 준비하기를 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background?language=objc
- 백그라운드 상태로 들어갈 때 치명적인 작업을 끝낸다. 가급적 많은 메모리를 해제하며 앱 스냅샷을 준비한다. 백그라운드에서 UI를 실행하기 위한 준비하기를 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background?language=objc
- 씬이 연결을 끊으면 씬과 연계된 모든 공유된 자원을 해제한다.
- 씬과 연계된 이벤트에 더해 UIApplicationDelegate 객체를 사용하여 앱의 실행에 반응한다. 앱 실행시 무엇을 할지에 대한 정보는 앱 실행에 반응하기 부분을 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app?language=objc

앱기반 라이프 사이클에 반응하기

iOS12 이전에는 앱은 씬을 지원하지 않으니 UIKit은 모든 라이프 사이클 이벤트를 UIApplicationDelegate객체로 전달한다. 앱 ㅇ델리게이트는 앱의 윈도우, 분리된 스크린에 표시된 모든 것을 관리한다. 결과적으로, 앱 상태 전이는 앱의 전체 UI에 영향을 끼치며, 외부 디스플레이에 콘텐트를 포함한다.

다음 그림은 앱 델리게이트 객체에 연관되는 상태 전이를 보여준다. 실행 이후 시스템은 앱을 비활성 또는 백그라운드 상태로 바꾸는데, 온스크린에 보여질 UI에 기반해 결정한다. 포어그라운드에서 실행할 때, 시스템은 자동적으로 활성 상태로 전이한다. 이후에, 상태는 앱이 종료되기 전 까지 활성 비활성을 오간다.

An illustration showing the state transitions for an app without scenes. The app launches into the active or background state. An app transitions through the inactive state.


앱 트랜지션은 다음과 같은 작업을 할 때 사용된다.
- 시작시, 앱의 자료구조와 UI를 초기화한다. 앱 시작에 반응하기를 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app?language=objc
- 활성상태일 때, UI 설정을 마치고 사용자에 상호작용을 준비한다. 포어그라운드에서 실행할 UI를 준비한다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground?language=objc
- 비활성화 상태일 때, 데이터를 저장하고 앱 작용을 없앤다. 백그라운드에서 UI를 실행을 위한 준비하기 부분을 살펴본다.
- 백그라운드 상태로 진입할 때, 치명적인 작업을 완료 하고, 가급적 많은 메모리를 해제하며 앱 스냅샷 준비를 한다.
- 종료 시, 모든 작업을 중지하고 모든 공유된 리소스를 해제한다. 
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623111-applicationwillterminate?language=objc

다른 중요한 이벤트에 반응하기

라이프 사이클 이벤트에 더해 앱은 반드시 다음 테이블에 나열된 이벤트를 다룰 준비를 해야 한다. UIApplicationDelegate 객체를 사용하여 이들 이벤트에 대응한다. 몇몇 상황에서, 알림을 통해 이들 이벤트를 다룰 수도 있어서 앱의 다룬 부분에서도 대응 할 수 있다.

메모리 경고: 앱의 메모리 사용이 너무 높을 때 받는다. 앱의 메모리 양을 줄인다. 메모리 경고에 반응하기 부분을 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle/responding_to_memory_warnings?language=objc
보호된 데이터가 가용/비가용: 사용자가 장치를 잠금 또는 해제 할 때 받는다. 
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623044-applicationprotecteddatadidbecom?language=objc
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623019-applicationprotecteddatawillbeco?language=objc
작업건내기: NSUserActivity 객체가 처리되어야 할 때 받는다. 
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622963-application?language=objc
시간대 변경: 시간대가 변경되었을 때, 폰 캐리어가 시간대 업데이트를 한 경우이다. 
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622992-applicationsignificanttimechange?language=objc
URL열기: 앱이 리소스를 열기 요청을 받았을 때이다. 
https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc

Scenes - Specifying the Scenes Your App Supports UIKit


Specifying the Scenes Your App Supports

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports?language=objc

각 씬에서 관리하는 객체들과 초기 사용자 인터페이스를 담은 앱의 장면에 대해 시스템에 알린다.

오버뷰

iOS 13 이후에 사용자는 앱의 UI의 다중 복사본을 생성할 수 있고 이들 간에 토글이 가능하다. iPad에서 사용자는 앱의 UI를 각 카피당 사이드 바이 사이드로 표시할 수 있다. 앱의 UI의 각 복사본은 윈도우, 뷰, 그리고 뷰컨트롤러를 관리하는데 씬 객체를 사용할 수 있다.

사용자가 새로운 장면을 요청할 때, UIKit 은 연관된 씬 객체를 생성하고 초기 설정을 처리한다. 이를 위해 UIKit은 제공되는 정보에 의존한다. 앱은 반드시 제공되는 씬의 형식과 이들 씬을 관리하는데 사용되는 객체를 지정해야 한다. Info.plist에서 정적으로 정의하거나 런타임에서 실시간 처리를 할 수 있다.

중요
씬은 옵트 인이다. 하지만 앱의 UI 가 동시에 다중 복사본을 보여줘야 한다면 반드시 제공해야 한다.

프로젝트 설정에서 씬 지원 활성화

앱은 반드시 씬에서 명시적으로 지정해야 하는데 앱의 설정 세팅을 업데이트 함으로서 수행한다.
1. Xcode 프로젝트를 연다
2. 앱의 타겟에 대한 일반 설정으로 이동
3. 디플로이먼트 정보 섹션의 "다중 윈도우 지원" 체크박스

멀티플 윈도우 옵션을 활성화 할 때 Xcode 는 UIApplicationSceneManifest 키를 Info.plist 파일로 추가한다. 이 키의 존재는 시스템이 지원하는 씬을 알 수 있게 한다. 이 키의 값은 딕셔너리인데, UIApplicationSupportsMultipleScenes키만을 포함한다.

UIApplicationSupportsMultipleScenes 키의 값은 시스템에서 앱이 다중 동시 신을 지원하는지를 알게 한다. Xcode는 초기에 이 값을 YES로 하지만, 한번에 하나만 보여줘야 한다면 이것을 비활성화 할 수 있다. 다중 씬을 지원하는 것은 다른 것에 방해되지 않도록 장면을 다루는 추가적인 작업을 수행해야 한다. 예를 들어, 만약 씬이 같은 데이터 구조체를 사용한다면 이들은 반드시 앱의 데이터의 결합을 유지하는 이들 구조에 대한 접근을 유의해야 한다.

각 씬의 세부 설정

UIKit 은 제공하는 정보를 제공하여 앱의 씬의 생성을 다룬다. 단순한 방법은 이 정보를 앱의 Info.plist 파일에서 제공하는 것이다.

1. Xcode 프로젝트를 열고 Info.plist 파일을 선택
2. 어플리케이션 씬 메니페이스 엔트리의 + 버튼 클릭. 이 엔트리는 UIApplicationSceneManifest 키와 연계된다. 만약 나타나지 않으면 프로젝트 설정에서 씬 지원 활성화하기 부분에서 설명되어 있다. https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports?language=objc#3262273
3. 메뉴로 부터 씬 설정을 살펴본다.
4. 씬 설정 엔트리에서 + 버튼을 클릭
5. 어플리케이션 세션 롤을 선택하여 앱에 메인 씬을 추가한다.
6. 제공된 엔트리 씬 세부 정보를 채운다.

대부분의 앱은 오직 하나의 메인 씬만을 필요로 하지만, 다중 장면을 추가하고 각각을 다르게 설정한다. 예를 들어, 알림 연계 콘텐트를 보여주기위해 두번째 장면을 포함할 수 있다. UIKit은 각 씬에 다음 정보를 필요로 한다.

- 씬의 클래스 이름, UIWindowScene
- 씬을 관리하는 데 사용하는 커스텀  델리게이트 객체의 클래스 이름. 클래스는 반드시 UIWindowSceneDelegate 프로토콜을 받아야 함
- 씬을 내부적으로 확인하는데 사용하는 유니크한 이름
- 씬의 초기 UI를 포함하는 스토리보드 이름. .storyboard  제외한 이름을 지정
더 세부적인 사항은 UISceneConfigurations 를 살펴본다.
https://developer.apple.com/documentation/bundleresources/information_property_list/uiapplicationscenemanifest/uisceneconfigurations?language=objc

씬에 대한 인터페이스 생성

스토리보드를 사용하여 씬에 대한 UI를 지정한다. UISceneStoryboardFile 에 지정할 스토리보드는 씬에서 보여질 초기 뷰컨트롤러를 포함한다. 씬 객체를 생성하고, UI킷은 해당 씬에 자동적으로 윈도우를 생성하고 스토리보드에 있는 초기 뷰컨트롤러를 설치한다. 이 뷰 컨트롤러는 UIWindowSceneDelegate 객체의 메소드를 사용하여 프로그래밍으로 변경할 수도 있다.

중요
스토리보드에서 반드시 초기 뷰 컨트롤러를 지정해야 함을 잊지 않기 바란다. UIKit은 UI를 설정할 때 뷰 컨트롤러의 표시에서 이를 의존한다.

씬의 설정을 동적으로 변경하기

씬 객체를 생성하기 전에, UIKit은 application:configurationForConnectingSceneSession:options: 메소드를 호출하여 신과 연계된 세부사항을 변경할 수 있게 해준다. 이 메소드를 사용하여 UIKit이 제공하는 옵션에 기반한 씬 설정을 조절할 수 있다. 예를 들어, 시스템이 씬에 대해 알림을 전달할 때, 알림 연관 인터페이스와 다른 스토리 보드를 지정할 수 있다.

만약 동적으로 씬을 지정하지 않는다면, UIKit은 앱의 Info.plist 파일내의 정보를 사용하여 씬을 생성한다.

씬 기반 라이프 사이클 시맨틱 적용

씬 변화를 위한 지원을 추가하는 것은 어떻게 라이브 사이클 이벤트에 반응할지가 변경됨을 뜻한다. 씬이 없는 앱은 앱 델리게이트 객체가 포어그라운드나 백그라운드에 트랜지션을 다룬다. 앱에 씬 지원을 추가할 때, UIKit은 이 책임을 씬 델리게이트로 전환한다. 씬 라이프 사이클은 다른 것에 독립적이고, 앱 자체에도 독립적이므로 씬 델리게이트 객체는 반드시 트랜지션을 처리해야  한다.

만약 앱이 iOS12 를 지원한다면 앱 델리게이트와 씬 델리게이트 양쪽에서 라이프 사이클 트랜지션을 다룰 수 있다. UIKit 은 오직 하나의 델리게이트 객체에만 알린다. iOS 13이후에는 UIKit은 신 델리게이트 객체로, iOS 12이 전은 앱 델리게이트에 알린다.

라이프 사이클 이벤트를 어떻게 다루는지에 대한 사항은 앱의 라이프 사이클 관리하기를 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle?language=objc


UIKit - Scene - Preparing Your UI to Run in the Background UIKit


Preparing Your UI to Run in the Background

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background?language=objc

오버뷰

앱은 다양한 이유에서 백그라운드 상태로 이동한다. 사용자가 포어그라운드 앱에서 나갔을 때 앱은 UIKit이 중지시키기 전에 백그라운드 상태로 이동한다. 시스템은 백그라운드 상태로 앱을 활성시키거나 백그라운드로 중지시키며, 중요한 작업을 수행할 수 있는 시간을 부여한다.

앱이 백그라운드에 있을 때, 최대한 적게 수행해야 하며, 가급적 아무것도 하지 않는 것이 좋다. 만약 앱이 이전에 포어그라운드에 있었다면, 백그라운드 트랜지션을 사용하여 작업을 중지하고 모든 공유된 리소스를 해제한다. 만약 앱이 백그라운드에 진입하여 중요한 이벤트를 처리한다면 최대한 빨리 이벤트를 처리하고 빠져나와야 한다.

UIKit의 모든 상태 트랜지션 결과는 적절한 델리게이트 객체로 알림을 보낸다.

- iOS 13 이후 - UISceneDelegate 객체
- iOS 12 이전 - UIApplicationDelegate 객체

양쪽 델리게이트 객체를 지원하면 UIKit은 항상 씬 델리게이트 객체를 사용한다. UIKit 은 오직 특정 씬으로 연계된 씬 델리게이트에만 백그라운드로 진입함을 알린다.

비활성화 상태에서 조용히 시키기

시스템은 앱을 비활성화 시키는 것은 몇가지 상황이 있다. 사용자가 포어그라운드 앱에서 나갔을 때, 시스템은 앱을 백그라운드로 이동시키기전에 앱을 비활성화 시킨다. 시스템은 또한 일시적으로 중지해야할 필요가 있을 때 앱을 비활성화 시킨다.  - 예를 들면, 시스템  엘럿을 보여줄 때. 시스템 패널의 경우에는, 시스템은 사용자가 패널을 사라질게 할 때 앱을 재활성화 시킨다.

비활성화 중에는, UIKit은 앱의 다음 메소드 중의 하나를 호출한다.
- 씬을 지원하는 앱에대해서는, 연관된 씬 델리게이트 객체의 sceneWillResignActive: 메소드를 호출한다.
- 다른 앱에서는, 앱 델리게이트 객체의 applicationWillResignActive: 메소드를 호출한다.

비활성화를 사용하여 사용자의 데이터를 보존하고 모든 주요 작업을 일시정지 함으로서 앱을 콰이어트 상태로 만든다.
- 사용자 데이터를 디스크에 저장하고 모든 열린 파일을 닫는다.
- 디스패치와 오퍼레이션 큐를 중지
- 실행을 위한 새로운 작업을 스케줄하지 않는다.
- 모든 활성 타이머를 무효화한다.
- 게임플레이를 자동적으로 일시정지한다.
- 새로운 메탈 작업을 커밋하지 않는다
- OpenGL명령을 커밋하지 않는다.

백그라운드 진입할 때 리소스 해제

앱이 백그라운드로 진입할 때, 앱이 잡고있는 공유 리소스를 해제한다. 포어그라운드에서 백그라운드로 전이하는 앱에대해 메모리 해제는 특히 중요하다. 포어그라운드 는 메모리와 다른 리소스에 대해 우선권을 가지고 시스템은 필요에 따라 백그라운드 앱을 종료해 이들 자원을 사용가능하게 한다. 만약 앱이 포어그라운드에 있지 않으면 최대한 적은 리소스만을 소비하도록한다.

백그라운드로 진입할 때 UIKit 은 앱에서 다음 메소드중 하나를 호출한다.

- 앱이 씬을 지원한다면 - sceneDidEnterBackground:
- 다른 앱 - applicationDidEnterBackground:

백그라운드 전이 도중 앱이 다음과 같은 작업을 처리하게 해야한다.
- 파일로부터 직접적으로 읽어들이는 이미지 또는 미디어를 해제한다.
- 디스크로부터 재생성하거나 리로드하는 인 메모리 객체를 해제 한다.
- 카메라에 대한 접근이나 다른 공유된 하드웨어 리소스에 대한 접근을 헤제한다.
- 앱의 사용자 인터페이스 내에 민감한 정보(암호와 같은)를 감춘다.
- 엘럿을 사라지게하고 다른 임시적인 인터페이스를 없앤다.
- 모든 공유된 시스템 데이터베이스와의 연결을 해제한다.
- 봉주르 서비스를 언레지스터하고, 이와 연관된 리스닝 소켓을 닫는다.
- 모든 메탈 명령 버버가 스케줄 되게 한다. 더 자세한 사항은 백그라운드에서 메탈앱이 실행되게 준비하기를 살펴본다.
https://developer.apple.com/documentation/metal/preparing_your_metal_app_to_run_in_the_background?language=objc
- 이전에 제출한 모든 OpenGL명령이 마치게 한다.

네임드 이미지는 지울 필요가 없는데, 이는 앱의 에셋 카탈로그로부터 로드했기 때문이다. 비슷하게, NSDiscardableContent 프로토콜을 사용하는 객체나 NSCache 객체를 사용하여 관리하는 객체는 릴리즈할 필요가 없다. 시스템은 이들 객체를 자동적으로 클린업한다.

앱이 백그라운드로 전이 할 때 공유된 시스템 리소스를 잡고있지 않아야 한다. 만약 카메라나 공유 시스템 데이터베이스에 백그라운드 상태인데도 계속 접근하면 시스템은 앱을 종료 시켜 리소스를 해제한다. 만약 시스템 프레임워크를 사용해 리소스에 접근한다면, 프레임워크의 다큐먼트를 확인하여 어떻게 하는지 가이드라인을 읽어본다.

앱 스냅샷을 위한 UI준비하기

앱이 백그라운드에 진입하고 델리게이트 메소드가 반환한 후 UIKit은 현 사용자인터페이스의 스냅샷을 찍는다. 시스템은 앱 스위쳐에서 결과이미지를 보여준다. 이 것은 또한 앱을 포어그라운드로 보낼 때 임시 이미지로도 활용된다.

앱의 UI는 반드시 사용자 인포메이션, 비밀번호나 크레디트 카드 번호와 같은 민감 정보는 포함하지 않도록 한다. 만약 인터페이스가 이러한 정보를 포함하면 백그라운드에 진입할 때 뷰로부터 제거한다. 또한, 엘럿, 임시 인터페이스, 시스템 뷰 컨트롤러를 없애서 앱의 컨텐트를 가리지 않게 한다. 스냅샷은 앱의 인터페이스를 나타내고 사용자가 알아먹을 수 있게 한다. 앱이 포어그라운드로 되돌아올 때 적절하게 데이터와 뷰를 되살린다.

일러두기
상태 보존과 되살리기를 지원하는 앱에 대해, 시스템은 델리게이트 메소드가 반환한 후 재빠르게 프로세스를 보존한다. 민감데이터를 제거하는 것은 앱의 저장소내에 정보를 저장하는 것도 방지하도록한다. 더 자세한 사항은 앱의 UI를 실행 사이에서 유지하기를 살펴본다.
https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches?language=objc

백그라운드에서 중요한 이벤트에 반응하기

앱은 백그라운드에 진입한 이후 추가적인 실행시간을 보통은 받지 않는다. 그러나, UIKit은 다음과 같은 시간에 민감한 상황을 지원해야 한다.
- AirPlay 또는 픽쳐인픽쳐 비디오를 사용한 오디오 교신
- 사용자를 위한 위치 민감 서비스
- 보이스 오버 IP
- 외부 엑세서리와의 교신
- 블루투스 LE 액세서리 또는 장치에서 블루투스 LE 액세서리로의 컨버전 과의 교신
- 서버로부터 정기적인 업데이트
- 애플 푸시 알림 서비스 (APNs) 지원

만약 백그라운드 기능을 지원한다면 Xcode 내에서 백그라운드 모드 를 활성화 한다. 각 백그라운드 작업은 다른 요구상을 가지는데 어떻게 그 기능을 구현할 지는 적절한 프레임워크를 통해 세부사항을 살핀다. 어떻게 백그라운드 작업을 수행할지에 대한 자세한 사항은 백그라운드 작업 부분을 살펴본다.
https://developer.apple.com/documentation/backgroundtasks?language=objc


Scenes - Preparing Your UI to Run in the Foreground UIKit


Preparing Your UI to Run in the Foreground

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground?language=objc

앱이 온스크린에서 보여지게 설정한다

오버뷰

포어그라운드 트랜지션을 사용하여 앱의 UI가 온스크린에 보여지도록 준비한다. 앱의 트랜지션이 포어그라운드인 것은 사용자 액션에 반응하는 것이다. 예를 들어, 사용자가 앱의 아이콘을 탭하면 시스템은 앱을 실행하고 이를 포어그라운드에 보낸다. 포어그라운드 트랜시션을 사용하여 앱의 UI를 업데이트하며, 리소스를 얻고, 사용자 요청을 처리하는데 필요한 서비스를 시작한다.

UIKit내의 모든 상태 트랜지션은 적절한 델리게이트 객체에 알림을 보내는 것이다.

- iOS 13 이 후 - UISceneDelegate 객체
- iOS 12이전 - UIApplicationDelegate 객체

이들 두 형식의 델리게이트 객체를 지원할 수 있지만, UIKit은 두 가지가 가용하다면 항상 씬 델리게이트를 사용한다. UIKit은 지정된 장면에 연계된 포어그라운드로 진입하는 씬 델리게이트에 알린다. 씬 지원을 설정하는 방법을 알고 싶으면 앱에서 지원하는 장면 지정하기를 살펴본다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/specifying_the_scenes_your_app_supports?language=objc

활성화할 때 사용자 인터페이스와 초기 작업 설정하기

시스템은 앱의 UI를 보이기 전에 앱을 활성상태로 즉시 이동시킨다. 활성화는 앱의 UI와 런타임 작용하는 좋은 타이밍인데, 특히:

- 앱의 윈도우를 필요하다면 보인다.
- 현재 보이는 뷰컨트롤러를 필요하다면 변경한다.
- 데이터 값과 뷰와 컨트롤의 상태를 업데이트한다.
- 일시정지된 게임에서 리쥼하기 위한 컨트롤을 보여준다.
- 작업을 활성화하는데 사용할 디스패치 큐 를 시작하거나 재시작한다.
- 데이터 소스 객체를 업데이트한다.
- 주기적 작업을 위한 타이머를 시작한다.

다음 메소드에 설정 코드를 넣는다.
- 씬 기반 UI에는 적합한 씬 델리게이트 객체의  sceneDidBecomeActive 메소드
- 다른 모든 앱 - 앱 델리게이트 객체의 applicationDidBecomeActive:  메소드

활성화는 사용자에게 보여지기 전에 UI의 터치를 완료해야 할 때 이기도 하다. 만약 코드를 실행하지 않으면 활성화 메소드를 막게될 수 있다. 대신, 필요로하는 모든 것을 수행하도록 한다. 예를 들어, 앱 외부에서 주기적으로 데이터를 변경한다면, 백그라운드 작업은 앱이 포어그라운드로 반환되기 전에 네트웍으로 부터 업데이트를 받아온다. 그렇지 않으면, 비동기적으로 변화를 받아오는 동안 존재하는 데이터를 보여줄 준비를 한다.

뷰가 보여질 때 UI지정 작업 시작

활성화 메소드가 반환될 때, UIKit은 윈도우를 보여준다. 이는 또한 연관된 뷰 컨트롤러를 알린다. 뷰 컨트롤러의 viewWillAppear: 메소드를 사용하여 인터페이스의 마지막 업데이트를 수행한다. 예를 들어:

- 적절하게 사용자 인터페이스 애니메이션을 시작한다.
- 만약 자동 재생이 활성화 되어 있다면 미디어 파일 재생을 시작한다.
- 게임을 위한 그래픽을 표시하고 이들 풀 프레임 레이트에서 이머시브 컨텐트를 보여준기 시작한다.

사용자 인터페이스에서 다른 뷰 컨트롤러를 보이려고 하거나 주요한 변화를 만들지 않는다. 뷰 컨트롤러가 온스크린에 보여질 때 인터페이스는 표시할 수 있는 준비가 되어있어야 한다.




UIKit - App and Environment - Scenes UIKit


Scenes

https://developer.apple.com/documentation/uikit/app_and_environment/scenes?language=objc

앱의 UI의 다중 인스턴스를 동시에 관리하고, UI의 적절한 인스턴스로 리소스를 보낸다.

오버뷰

UIKit 은 앱의 UI의 각 인스턴스를 UIWindowScene 객체를 사용하여 관리한다. 씬은 윈도우와 뷰 컨트롤러를 UI의 한 인스턴스를 표시하기 위해 포함한다. 각 씬은 UIWindowSceneDelegate 객체를 가지는데, 이 것은 UIKit과 앱 사이의 좌표 인터렉션으로 사용한다. 씬은 각각에서 동시에 실행하는데 같은 메모리와 앱 프로세스 공간을 공유한다. 결과적으로, 단일 앱은 다중 씬과 씬 델리게이트 객체를 동시에 활성화되게 한다.

An image showing two instances of the Notes app running side-by-side on iPad.

UIApplicationDelegate 객체로 부터 새로운 장면의 설정을 관리한다.



1 2 3 4 5 6 7 8 9 10 다음