"Prepare your app to be suspended."
앱이 일시정지 상태가 되도록 준비합니다.
여러 가지 이유로 앱은 백그라운드 상태에 이동될 수 있습니다. 사용자가 포어그라운드 앱을 빠져나가면, 해당 앱은 UIKit
이 일시정지시키기 전에 잠시 백그라운드 상태로 이동합니다. 시스템은 직접 앱을 백그라운드 상태로 launch 하기도 하거나 일시정지된 앱을 백그라운드 상태로 이동시킵니다. 그리고 중요한 작업을 수행할 시간을 줍니다.
앱이 백그라운드에 진입하면, 가능한 작은 작업만을 해야 하거나 아무것도 하지 않아야 합니다. 앱이 이전에 포어그라운드에 있었다면, 작업을 멈추고 모든 공유된 리소스를 해제하기 위해 백그라운드 전환을 사용해야 합니다. 앱이 중요한 이벤트를 처리하기 위해 백그라운드에 진입하는 경우 가능한 빠르게 이벤트를 처리하고 빠져나와야 합니다.
모든 상태 전환은 UIKit
이 적합한 딜리게이트 객체에 노티피케이션을 보내도록 합니다.
UISceneDelegate
객체입니다.UIApplicationDelegate
객체입니다.두 가지 딜리게이트 객체 타입 모두를 지원할 수 있지만, UIKit
은 씬 딜리게이트 객체가 사용한 경우 항상 씬 딜리게이트 객체를 사용합니다. UIKit
은 백그라운드에 진입하는 특정 씬과 관련이 있는 씬 딜리게이트에 대한 정보만을 알려줍니다.
시스템은 여러 가지 이유로 앱을 비활성화합니다. 사용자가 포어그라운드 앱에을 종료할 때, 시스템은 백그라운드로 이동시키기 전에 즉시 해당 앱을 비활성화합니다. 또한, 시스템은 일시적으로 인터럽트가 필요할 때 앱을 비활성화합니다(예를 들어 시스템 경고 표시). 시스템 패널의 경우 시스템은 사용자가 패널을 해제할 때 앱을 재활성화합니다.
비활성화 동안 UIKit
은 앱의 아래 메소드 중 한 가지를 호출합니다.
sceneWillResignActive(_:)
메소드입니다.applicationWillResignActive(_:)
메소드입니다.주요한 작업을 일시정지시키면서 사용자의 데이터를 보존하고 앱을 조용한 상태로 두려면 비활성화를 사용해야 합니다.
앱이 백그라운드로 전환될 때, 메모리를 해제하고 앱이 갖고 있는 공유된 리소스 모두를 비워야 합니다. 포어그라운드에서 백그라운드로 전환하는 경우 메모리를 비우는 것은 특히 중요합니다. 포어그라운드는 메모리 및 다른 시스템 리소스에서 우선순위를 갖고 있으며, 시스템은 이와 같은 리소스를 사용 가능한 상태로 만들기 위해 필요에 따라 백그라운드 앱을 종료시킵니다. 앱이 포어그라운드에 있지 않았었더라도 가능한 적은 리소스만을 소비하고 있었는지를 확실히 하기 위해 확인해야 합니다.
백그라운드 진입에 따라 UIKit
은 앱이 가지고 있는 아래 메소드 중 한 가지를 호출합니다.
sceneDidEnterBackground(_:)
메소드입니다.applicationDidEnterBackground(_:)
메소드입니다.백그라운드 전환 동안 앱에 대해서 합리적이라 생각하는 아래 작업을 가능한 많이 수행하시기 바랍니다.
Preparing Your Metal App to Run in the Background
https://developer.apple.com/documentation/metal/preparing_your_metal_app_to_run_in_the_background
https://velog.io/@panther222128/Preparing-Your-Metal-App-to-Run-in-the-Background
앱의 에셋 카탈로그로부터 로드된 네임드 이미지를 버릴 필요는 없습니다. 유사하게 NSDiscardableContent
채택하고 있거나 NSCache
객체를 사용해서 관리하고 있는 객체를 해제할 필요도 없습니다. 시스템은 이와 같은 객체를 비울 수 있도록 자동으로 처리합니다.
앱이 백그라운드로 전환될 때 모든 공유된 시스템 리소스를 갖고 있지 않도록 확실히 해야 합니다. 백그라운드 전환 이후에도 카메라 혹은 공유된 시스템 데이터베이스와 같은 리소스에 접근을 계속하고 있다면, 시스템은 해당 리소스를 비우기 위해 앱을 종료시킵니다. 만약 리소스 접근을 위해 시스템 프레임워크를 사용하고 있다면, 무엇을 해야 하는지에 대해서 프레임워크 문서의 가이드 문서를 살펴보시기 바랍니다.
앱이 백그라운드로 진입하고 딜리게이트 메소드가 반환한 후, UIKit
은 현재 앱의 UI에 대한 스냅샷을 남깁니다. 시스템은 앱 전환자에서 결과 이미지를 표시합니다. 앱을 백그라운드에서 포어그라운드로 가져올 때에도 일시적으로 이미지를 표시합니다.
앱의 UI는 암호, 신용카드 숫자와 같은 민감한 사용자 정보를 포함하지 않아야 합니다. 인터페이스가 이와 같은 정보를 포함하고 있다면, 백그라운드 진입 시 뷰로부터 해당 정보를 지워야 합니다. 또한, 경고, 일시적 인터페이스, 앱 컨텐트를 가리는 시스템 뷰 컨트롤러를 해제해야 합니다. 스냅샷은 앱의 인터페이스를 나타내고, 사용자에게 인식가능한 것이어야 합니다. 앱이 포어그라운드로 돌아오면, 적합한 형태로 데이터 및 뷰를 복원할 수 있습니다.
Note
상태 보존 및 복원을 지원하는 앱의 경우 시스템은 딜리게이트 메소드 반환 후 잠시 복원 프로세스를 시작합니다. 민감한 데이터를 지우는 것은 앱의 복원 아카이브에 해당 정보가 저장되는 것을 방지하기도 합니다. 더 많은 정보는 Preserving Your App's UI Across Launches를 살펴보시기 바랍니다.
Preserving Your App's UI Across Launches
https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches
https://velog.io/@panther222128/Preserving-Your-Apps-UI-Across-Launches
앱이 백그라운드 진입 후 추가적인 실행 시간을 받지 못합니다. 그러나 UIKit
은 시간에 민감한 기능을 지원하는 앱의 경우 실행 시간을 승인합니다. 아래와 같습니다.
백그라운드 기능을 지원하는 앱이라면 Xcode에서 백그라운드 모드 기능을 활성화해야 합니다. 각 백그라운드 작언은 다른 요구사항을 가질 것입니다. 기능 구현 방법에 대한 자세한 내용은 해당하는 프레임워크를 살펴보시기 바랍니다. 백그라운드 작업 스케줄링 방법에 대한 더 많은 내용은 Background Tasks를 살펴보시기 바랍니다.
Background Tasks
https://developer.apple.com/documentation/backgroundtasks
https://velog.io/@panther222128/Background-Tasks
필요에 따라 백그라운드에서 컨텐트를 가져오고 앱의 인터페이스를 업데이트합니다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/updating_your_app_with_background_app_refresh
https://velog.io/@panther222128/Updating-Your-App-with-Background-App-Refresh
앱이 백그라운드로 이동할 때 중요한 작업을 마무리할 수 있도록 합니다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/extending_your_app_s_background_execution_time
https://velog.io/@panther222128/Extending-Your-Apps-Background-Execution-Time
앱이 백그라운드로 이동할 때 커스텀 코드가 수행되는 순서에 대해 알아봅니다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background/about_the_background_execution_sequence
https://velog.io/@panther222128/About-the-Background-Execution-Sequence
화면에 나타날 수 있도록 앱을 설정합니다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_foreground
https://velog.io/@panther222128/Preparing-Your-UI-to-Run-in-the-Foreground