Preparing Your UI to Run in the Background

Panther·2021년 8월 15일
0

https://developer.apple.com/documentation/uikit/app_and_environment/scenes/preparing_your_ui_to_run_in_the_background

"Prepare your app to be suspended."

앱이 일시정지 상태가 되도록 준비합니다.

Overview

여러 가지 이유로 앱은 백그라운드 상태에 이동될 수 있습니다. 사용자가 포어그라운드 앱을 빠져나가면, 해당 앱은 UIKit이 일시정지시키기 전에 잠시 백그라운드 상태로 이동합니다. 시스템은 직접 앱을 백그라운드 상태로 launch 하기도 하거나 일시정지된 앱을 백그라운드 상태로 이동시킵니다. 그리고 중요한 작업을 수행할 시간을 줍니다.

앱이 백그라운드에 진입하면, 가능한 작은 작업만을 해야 하거나 아무것도 하지 않아야 합니다. 앱이 이전에 포어그라운드에 있었다면, 작업을 멈추고 모든 공유된 리소스를 해제하기 위해 백그라운드 전환을 사용해야 합니다. 앱이 중요한 이벤트를 처리하기 위해 백그라운드에 진입하는 경우 가능한 빠르게 이벤트를 처리하고 빠져나와야 합니다.

모든 상태 전환은 UIKit이 적합한 딜리게이트 객체에 노티피케이션을 보내도록 합니다.

  • iOS 13 및 이후 버전—UISceneDelegate 객체입니다.
  • iOS 12 및 이전 버전—UIApplicationDelegate 객체입니다.

두 가지 딜리게이트 객체 타입 모두를 지원할 수 있지만, UIKit은 씬 딜리게이트 객체가 사용한 경우 항상 씬 딜리게이트 객체를 사용합니다. UIKit은 백그라운드에 진입하는 특정 씬과 관련이 있는 씬 딜리게이트에 대한 정보만을 알려줍니다.

Quiet Your App upon Deactivation

시스템은 여러 가지 이유로 앱을 비활성화합니다. 사용자가 포어그라운드 앱에을 종료할 때, 시스템은 백그라운드로 이동시키기 전에 즉시 해당 앱을 비활성화합니다. 또한, 시스템은 일시적으로 인터럽트가 필요할 때 앱을 비활성화합니다(예를 들어 시스템 경고 표시). 시스템 패널의 경우 시스템은 사용자가 패널을 해제할 때 앱을 재활성화합니다.

비활성화 동안 UIKit은 앱의 아래 메소드 중 한 가지를 호출합니다.

  • 씬을 지원하는 앱—적합한 씬 딜리게이트 객체의 sceneWillResignActive(_:) 메소드입니다.
  • 다른 모든 경우의 앱—앱 딜리게이트 객체의 applicationWillResignActive(_:) 메소드입니다.

주요한 작업을 일시정지시키면서 사용자의 데이터를 보존하고 앱을 조용한 상태로 두려면 비활성화를 사용해야 합니다.

  • 디스크에 사용자 데이터를 저장하고 열려있는 모든 파일을 닫습니다.
  • 디패치 및 작업 큐를 일시정지합니다.
  • 일행 동안 새로운 작업을 스케줄링하지 않아야 합니다.
  • 모든 활성화된 타이머를 무효화합니다.
  • 게임플레이를 자동으로 일시정지합니다.
  • 처리되기 위핸 새로운 Metal 작업을 커밋하지 않아야 합니다.
  • 새로운 OpenGL 명령을 커밋하지 않아야 합니다.

Release Resources upon Entering the Background

앱이 백그라운드로 전환될 때, 메모리를 해제하고 앱이 갖고 있는 공유된 리소스 모두를 비워야 합니다. 포어그라운드에서 백그라운드로 전환하는 경우 메모리를 비우는 것은 특히 중요합니다. 포어그라운드는 메모리 및 다른 시스템 리소스에서 우선순위를 갖고 있으며, 시스템은 이와 같은 리소스를 사용 가능한 상태로 만들기 위해 필요에 따라 백그라운드 앱을 종료시킵니다. 앱이 포어그라운드에 있지 않았었더라도 가능한 적은 리소스만을 소비하고 있었는지를 확실히 하기 위해 확인해야 합니다.

백그라운드 진입에 따라 UIKit은 앱이 가지고 있는 아래 메소드 중 한 가지를 호출합니다.

  • 씬을 지원하는 앱—적합한 씬 딜리게이트 객체의 sceneDidEnterBackground(_:) 메소드입니다.
  • 다른 모든 경우의 앱—앱 딜리게이트 객체의 applicationDidEnterBackground(_:) 메소드입니다.

백그라운드 전환 동안 앱에 대해서 합리적이라 생각하는 아래 작업을 가능한 많이 수행하시기 바랍니다.

  • 파일로부터 직접 읽는 이미지 및 미디어를 버립니다.
  • 디스크로부터 재생성할 수 있거나 다시 로드할 수 있으면서 메모리에 존재하는 큰 객체를 버립니다.
  • 카메라 및 다른 공유된 하드웨어 리소스 접근을 해제합니다.
  • 앱의 UI에서 민감한 정보(암호와 같은)를 숨깁니다.
  • 경고 및 다른 일시적 인터페이스를 해제합니다.
  • 공유된 시스템 데이터베이스에 대한 연결을 닫습니다.
  • Bonjour 서비스로부터 등록해제하고, 이에 관련된 모든 listening 소켓을 닫습니다.
  • 모든 Metal 명령 버퍼가 스케줄링되는 것을 확실히 합니다. 더 많은 정보는 Preparing Your Metal App to Run in the Background를 살펴보시기 바랍니다.
  • 이전에 제시했던 모든 OpenGL 명령이 완료되었음을 확실히 합니다.

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 객체를 사용해서 관리하고 있는 객체를 해제할 필요도 없습니다. 시스템은 이와 같은 객체를 비울 수 있도록 자동으로 처리합니다.

앱이 백그라운드로 전환될 때 모든 공유된 시스템 리소스를 갖고 있지 않도록 확실히 해야 합니다. 백그라운드 전환 이후에도 카메라 혹은 공유된 시스템 데이터베이스와 같은 리소스에 접근을 계속하고 있다면, 시스템은 해당 리소스를 비우기 위해 앱을 종료시킵니다. 만약 리소스 접근을 위해 시스템 프레임워크를 사용하고 있다면, 무엇을 해야 하는지에 대해서 프레임워크 문서의 가이드 문서를 살펴보시기 바랍니다.

Prepare Your UI for the App Snapshot

앱이 백그라운드로 진입하고 딜리게이트 메소드가 반환한 후, 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

Respond to Important Events in the Background

앱이 백그라운드 진입 후 추가적인 실행 시간을 받지 못합니다. 그러나 UIKit은 시간에 민감한 기능을 지원하는 앱의 경우 실행 시간을 승인합니다. 아래와 같습니다.

  • AirPlay를 사용하는 오디오 커뮤니케이션 혹은 Picture video에 있는 Picture입니다.
  • 사용자를 위한 위치에 민감한 서비스입니다.
  • IP를 거치는 보이스입니다.
  • 외부 액세서리와 소통입니다.
  • 블루투스 LE 액세서리와 소통 혹은 블루투스 LE 액세서리에서 기기의 변환입니다.
  • 서버로부터의 정기 업데이트입니다.
  • 애플 푸시 노티피케이션 서비스(APNs) 지원입니다.

백그라운드 기능을 지원하는 앱이라면 Xcode에서 백그라운드 모드 기능을 활성화해야 합니다. 각 백그라운드 작언은 다른 요구사항을 가질 것입니다. 기능 구현 방법에 대한 자세한 내용은 해당하는 프레임워크를 살펴보시기 바랍니다. 백그라운드 작업 스케줄링 방법에 대한 더 많은 내용은 Background Tasks를 살펴보시기 바랍니다.

Background Tasks
https://developer.apple.com/documentation/backgroundtasks
https://velog.io/@panther222128/Background-Tasks

Topics


Background Execution

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/updating_your_app_with_background_app_refresh
https://velog.io/@panther222128/Updating-Your-App-with-Background-App-Refresh

Extending Your App's Background Execution Time

앱이 백그라운드로 이동할 때 중요한 작업을 마무리할 수 있도록 합니다.

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

About the Background Execution Sequence

앱이 백그라운드로 이동할 때 커스텀 코드가 수행되는 순서에 대해 알아봅니다.

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


See Also


Essentials

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
https://velog.io/@panther222128/Preparing-Your-UI-to-Run-in-the-Foreground


0개의 댓글