앱이 일시 중지되도록 준비한다.
Overview
앱은 여러 가지 이유로 백그라운드 상태로 이동한다. 사용자가 포어그라운드 앱을 종료하면 해당 앱은 UIKit에서 일시 중지하기 전에 잠시 백그라운드 상태로 이동한다. 시스템은 앱을 직접 백그라운드 상태로 시작하거나 일시 중단 된 앱을 백그라운드로 이동하여 중요한 태스크를 수행 할 시간을 제공 할 수도 있다.
앱이 백그라운드에 있을 때 가능한 한 적은 작업을 수행해야 하며 가급적 아무 작업도 수행하지 않아야 한다. 앱이 이전에 포어그라운드에 있었던 경우 백그라운드 전환을 사용하여 작업을 중지하고 공유 리소스를 해제한다. 앱이 중요한 이벤트를 처리하기 위해 백그라운드로 들어가면 이벤트를 처리하고 최대한 빨리 종료하시오.
모든 상태가 전환되면 UIKit이 적절한 델리게이트 오브젝트에 알림을 보낸다.
- iOS 13 이상일 때, UISceneDelegate Object
- iOS 12 이하일 때, UIApplicationDelegate Object
두 가지 유형의 델리게이트 오브젝트를 모두 지원할 수 있지만 UIKit은 사용 가능한 경우 항상 씬 델리게이트 오브젝트를 사용한다. UIKit은 백그라운드로 들어가는 특정 씬과 관련된 씬 델리게이트에게만 알린다.
Quiet Your App upon Deactivation
시스템은 여러 가지 이유로 앱을 비활성화한다. 사용자가 포어그라운드 앱을 종료하면 시스템은 백그라운드로 이동하기 직전에 해당 앱을 비활성화한다. 또한 시스템은 시스템 경고를 표시하기 위해 앱을 일시적으로 중단해야 하는 경우 앱을 비활성화한다. 시스템 패널의 경우 사용자가 패널을 닫으면 시스템이 앱을 다시 활성화한다.
비활성화하는 동안 UIKit은 앱의 다음 메서드 중 하나를 호출한다.
- 씬을 지원하는 앱의 경우일 때, 적절한 씬 델리게이트 오브젝트의 sceneWillResignActive(_:) 메서드이다.
- 다른 모든 앱의 경우일 때, 앱 델리게이트 오브젝트의 applicationWillResignActive(_:) 메서드이다.
비활성화를 사용하여 사용자의 데이터를 보존하고 모든 메이저 작업을 일시 중지하여 앱을 중지한 상태로 만든다.
구체적으로 특별히 하단의 경우이다.
- 사용자 데이터를 디스크에 저장하고 열려있는 모든 파일을 닫는다.
- dispatch 및 operation queue를 일시 중지한다.
- 새로운 태스크를 실행하도록 예약하지 마시오.
- 활성 타이머를 무효화하시오.
- 게임 플레이를 자동으로 일시 중지한다.
- 새로운 Metal 작업을 처리하도록 커밋하지 마시오.
- 새로운 OpenGL 명령을 실행하지 마시오.
Release Resources upon Entering the Background
앱이 백그라운드로 전환되면 메모리를 해제하고 앱이 보유하고 있는 공유 리소스를 확보하시오. 포어그라운드에서 백그라운드로 전환되는 앱의 경우 메모리를 확보하는 것이 특히 중요하다. 포어그라운드는 메모리 및 기타 시스템 리소스보다 우선 순위를 가지며 시스템은 이러한 리소스를 사용할 수 있도록 필요에 따라 백그라운드 앱을 종료한다. 앱이 포어그라운드에 있지 않더라도 가능한 한 적은 리소스를 사용하는지 확인해야 한다.
백그라운드에 들어가면 UIKit은 앱의 다음 메서드 중 하나를 호출한다.
- 씬을 지원하는 앱의 경우일 때, 적절한 씬 델리게이트 오브젝트의 sceneDidEnterBackground(_:) 메서드이다.
- 다른 모든 앱의 경우일 때, 앱 델리게이트 오브젝트의 applicationDidEnterBackground(_:) 메서드이다.
백그라운드 전환 중에 앱에 적합한 하단의 태스크를 수행한다.
- 파일에서 직접 읽은 이미지나 미디어를 폐기하시오.
- 디스크에서 재생성하거나 다시 로드 할 수 있는 모든 대용량 메모리 내 오브젝트를 폐기하시오.
- 카메라 및 기타 공유 하드웨어 리소스에 대한 액세스를 해제하시오.
- 앱의 사용자 인터페이스에서 민감한 정보(예: 비밀번호)를 숨기시오.
- 경고 및 기타 임시 인터페이스를 닫으시오.
- 공유 시스템 데이터베이스에 대한 연결을 닫으시오.
- Bonjour 서비스에서 등록을 취소하고 연결된 모든 리스닝 소켓을 닫으시오.
- 모든 Metal 명령 버퍼가 예약되었는지 확인하시오. 자세한 내용은 Preparing Your Metal App to Run in the Background를 참조하시오.
- 이전에 서브밋한 모든 OpenGL 명령이 완료되었는지 확인하시오.
app’s asset catalog에서 로드한 명명된 이미지를 삭제할 필요가 없다. 마찬가지로 NSDiscardableContent 프로토콜을 채택하거나 NSCache 오브젝트를 사용하여 관리하는 오브젝트를 해제할 필요가 없다. 시스템은 이러한 오브젝트의 정리를 자동으로 처리한다.
앱이 백그라운드로 전환될 때 공유 시스템 리소스를 보유하고 있지 않은지 확인한다. 백그라운드로 전환한 후에도 카메라 또는 공유 시스템 데이터베이스와 같은 리소스에 계속 액세스하면 시스템은 해당 리소스를 확보하기 위해 앱을 종료한다. 시스템 프레임워크를 사용하여 리소스에 액세스하는 경우 프레임워크의 설명서에서 수행 할 작업에 대한 지침을 확인하시오.
Prepare Your UI for the App Snapshot
앱이 백그라운드로 들어가고 델리게이트 메서드가 반환되면 UIKit이 앱의 현재 사용자 인터페이스에 대한 스냅샷을 생성한다. 시스템은 앱 전환기에 결과 이미지를 표시한다. 또한 앱을 포어그라운드로 되돌릴 때 일시적으로 이미지를 표시한다.
앱의 UI에는 비밀번호나 신용 카드 번호와 같은 민감한 사용자 정보가 포함되어서는 안된다. 인터페이스에 이러한 정보가 포함되어 있으면 백그라운드로 들어갈 때 뷰에서 제거하시오. 또한 앱의 콘텐츠를 가리는 alerts, temporary interfaces, system view controller를 닫는다. 스냅샷은 앱의 인터페이스를 나타내며 사용자가 알아볼 수 있어야 한다. 앱이 포어그라운드로 돌아가면 데이터와 뷰를 적절하게 복원 할 수 있다.
노트
상태 보존 및 복원을 지원하는 앱의 경우 시스템은 델리게이트 메서드가 반환 된 직후 preservation process를 시작한다. 민감한 데이터를 제거하면 해당 정보가 앱의 preservation archive에 저장되지 않는다. 자세한 내용은 시작시 Preserving Your App's UI Across Launches를 참조하시오.
Respond to Important Events in the Background
앱은 일반적으로 백그라운드로 들어간 후 추가 실행 시간을 받지 않는다. 그러나 UIKit은 하단과 같은 시간에 민감한 기능을 지원하는 앱에 실행 시간을 부여한다.
- AirPlay을 활용한 오디오 통신 또는 Picture in Picture 비디오.
- 사용자를 위한 위치에 민감한 서비스.
- VoIP (Voice over IP).
- 외부 액세서리와의 통신.
- Bluetooth LE 액세서리와 통신하거나 장치를 Bluetooth LE 액세서리로 변환한다.
- 서버에서 정기적으로 업데이트한다.
- Apple Push Notification service (APNs) 지원.
앱이 백그라운드 기능을 지원하는 경우 Xcode에서 백그라운드 모드 기능을 활성화한다. 백그라운드 태스크마다 요구 사항이 다르다. 기능을 구현하는 방법에 대한 자세한 내용은 해당 프레임워크를 참조하시오. opportunistic background task를 스케줄링하는 방법에 대한 자세한 내용은 백그라운드 작업을 참조하시오.
[원문]
Apple Developer Documentation
developer.apple.com
'프로그래밍 > iOS' 카테고리의 다른 글
Responding to the Launch of Your App (0) | 2020.12.31 |
---|---|
Background Tasks (0) | 2020.12.31 |
Preparing Your UI to Run in the Foreground (0) | 2020.12.31 |
Specifying the Scenes Your App Supports (0) | 2020.12.31 |
Managing Your App's Life Cycle (0) | 2020.12.31 |