Managing Your App's Life Cycle
앱의 수명주기 관리: 앱이 foreground 이거나 background 상태일때, 다른 중요한 시스템 이벤트 처리를 다룹니다.(handling)
시스템 이벤트 처리에 관한 메소드, 작업이 가능한 상태와 불가능한 상태
앱의 현재 상태에 따라 언제든지 할 수있는 작업과 할 수없는 작업이 결정됩니다. 예를 들어 foreground 일때는 사용자의주의를 끌기 때문에 CPU를 포함한 시스템 리소스보다 우선합니다. 반대로 background 앱은 화면 밖에 있기 때문에 가능한 한 적은 작업을 수행해야하며 가급적 아무것도 수행하지 않아야합니다. 앱이 상태별로 변경되면 그에 따라 동작을 조정해야합니다.
앱의 상태가 변경되면 UIKit은 적절한 delegate object 메서드를 호출하여 알려줍니다.
UIKit의 delegate object 메소드 들에대해서 알아봅시다.
App-Based Life-Cycle Events (iOS 12 이하 버전)
시작시 앱의 데이터 구조와 UI를 초기화합니다. 앱 시작에 대한 응답을 참조하십시오.
활성화시 UI 구성을 완료하고 사용자와 상호 작용할 준비를합니다. 포 그라운드에서 실행할 UI 준비를 참조하십시오.
비활성화되면 데이터를 저장하고 앱 동작을 조용히합니다. 백그라운드에서 실행되도록 UI 준비를 참조하십시오.
백그라운드 상태에 들어가면 중요한 작업을 완료하고 가능한 한 많은 메모리를 확보하고 앱 스냅 샷을 준비합니다. 백그라운드에서 실행되도록 UI 준비를 참조하세요. 종료시 모든 작업을 즉시 중지하고 공유 리소스를 해제하십시오. (applicationWillTerminate (_ :) 메소드 참조)
앱이 foreground 전환된 것은 사용자의 작업에 대한 응답이다. ex) 유저가 앱 아이콘을 터치하면 시스템이 앱을 실행하고 foreground로 가져온다.
+) 부연설명
앱 실행시 바로 foreground로 가는 것이 아니라, 위의 그림과 같이 비활성 상태에서 시작. 이 시점에서 해당 시점에 필요한 작업도 같이 처리함.
앱이 백그라운드 상태일때, UIKit은 applicationWillEnterForeground(_:) method 를 이용해 앱을 비활성 상태로 이동 시킬 수 있음. (iOS 13 이상 버전에서는, apllication -> scene 이겠죠?)
//앱의 데이터 구조 초기화할때 사용되어지는 메소드 밑에 2개
//앱 실행된 직후 사용자의 화면에 보여지기 직전에 호출
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
//앱 최초 실행될 때 호출되는 메소드
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
위의 메소드 역할:앱이 처음 실행될 때 모든 일회성 설정을 수행시킨다. 예를 들어, 쓰기 가능한 디렉토리에 템플릿이나 사용자가 수정할 수있는 파일을 설치합니다. 예를 들어 앱이 원격 알림을 지원하는 경우 Apple 푸시 알림 서비스에 연결합니다.
//애플리케이션이 InActive 상태로 전환되기 직전에 호출
func applicationWillResignActive(_ application: UIApplication)
//애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)
//애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출
func applicationWillEnterForeground(_ application: UIApplication)
//애플리케이션이 Active 상태로 전환된 직후 호출
func applicationDidBecomeActive(_ application: UIApplication)
//애플리케이션이 종료되기 직전에 호출
func applicationWillTerminate(_ application: UIApplication)
- Not Running : 실행되지 않았거나, 시스템에 의해 종료된 상태
- Inactive : 실행 중이지만 이벤트를 받고있지 않은 상태. 예를들어, 앱 실행 중 미리알림 또는 일정 Alert이 화면에 덮여있는 상태
- Active : 어플리케이션이 실질적으로 활동하고 있는 상태. (우리가 실질적으로 앱을 사용할때 보여지는)
- Background : 백그라운드 상태에서 실질적인 동작을 하고 있는 상태. 예를 들어 백그라운드에서 음악을 실행하거나(잠금 모드로 멜론 재생), 걸어온 길을 트래킹 하는(건강앱 걸음 횟수) 등
- suspended : 백그라운드 상태에서 활동을 멈춘 상태. 빠른 재실행을 위하여 메모리에 적재된 상태지만 실질적으로 동작하고 있지는 않습니다. 메모리가 부족할때 비로소 시스템이 강제종료하게 됩니다. (절전 모드 같은 상태)
실제 프로젝트에서의 사용
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.willEnterForegroundNotification, object: nil)
앱에서 지도의 길찾기 기능 사용을 위해 지도앱을 갔다가 다시 본래의 앱으로 돌아오면 탭바가 hidden되어 있는 상태가 false가 되어서 다시 탭바가 보여지는 현상이 발생함
그래서 위와 같은 코드를 이용해 앱이 다시 foreground 상태로 돌아올때, 탭바를 hidden 해줘서 이러한 현상을 해결!
위와 같은 delegate 상태 메소드을 적절히 사용해 앱의 알림을 설정하거나, 다른 앱에 갔다가 잃어 버린 정보나 값을 되돌려 주는 것을 설정해줄때 많이 사용하게 된다.
그리고 적절하게 이러한 메소들을 사용하고나면..
위와 같이 활성화 메소드가 반환되고, UIKit은 사용자가 표시할 window를 표시하고 이와 관련한 View Controller가 나타날 것을 알리고 viewWillAppear() 메소드를 사용하여 인터페이스에 대한 최종 업데이트를 진행한다!
- 적절한 유저 인터페이스 애니메이션을 시작
- 미디어 파일 재생(자동 재생 활성화 일때)
- 게임이나 풀 프레임 속도의 컨텐츠를 보여주기 시작함
- 주의)다른 뷰 컨트롤러를 표시하거나 변화가 큰 유저 인터페이스를 주면 안됨, View Controller가 화면에 나타날때까지 인터페이스를 표시할 준비가 되어있어야 하기 때문.
참고
'Deep Dive iOS' 카테고리의 다른 글
앱이 inactive 상태가 되는 경우 (0) | 2020.11.11 |
---|---|
iOS/Swift) UIKit 이란? (0) | 2020.11.10 |
시뮬레이터에서 할 수 없는 것과 실제 iPhone과의 차이 (0) | 2020.11.05 |
frame and bounds (0) | 2020.11.05 |
Scene delegate? + App Delegate (0) | 2020.11.05 |