-
[iOS] 앱의 상태 변화에 따른 AppDelegateiOS/iOS 2020. 11. 6. 11:15
안녕하세요 :)
오늘은 앱의 상태가 변화되면서 AppDelegate에서 어떤 메서드들이 실행되는지 알아보도록 하겠습니다.
iOS의 상태
앱의 상태 변화라는 것은 화면에 나타났거나, 화면 뒤로 숨겨졌거나, 시작되었거나 종료되었거나 등을 의미합니다.
iOS에서 앱이 가질 수 있는 상태는 아래와 같습니다.
- Not Running : 앱이 시작되지 않았거나 실행되었지만 시스템에 의해 종료된 상태
- Inactive : 앱이 전면에서 실행 중이지만, 아무런 이벤트를 받지 않고 있는 상태
- Active : 앱이 전면에서 실행 중이며, 이벤트를 받고 있는 상태
- Background : 앱이 백그라운드에 있지만 여전히 코드가 실행되고 있는 상태
대부분의 앱은 Suspended 상태로 이행하는 도중에 일시적으로 이 상태에 진입하지만,
파일 다운로드, 업로드, 연산 처리 등 여분의 실행 시간이 필요한 앱일 경우 특정 시간 동안 이 상태로 남아있는다. - Suspended : 앱이 메모리에 유지되지만 실행되는 코드가 없는 상태
메모리가 부족한 상황이 오면 iOS 시스템은 전면에 있는 앱이 여유 메모리 공간을 확보하기 위해
Suspended 상태에 있는 앱들을 특별한 알림 없이 정리한다.
iOS 앱은 Not Running 상태에서 시작하여 Inactive, Active를 거친 다음, Suspended 상태를 마지막으로 다시 Not Running 상태로 돌아갑니다.
이것이 바로 앱의 생명 주기(Life Cycle) 입니다.
특정 앱은 위의 상태 중 하나의 상태일 수도 있고, 어떤 상태에서 다른 상태로 옮겨가는 중일 수도 있습니다.
상태가 다른 상태로 옮겨가는 중일 때를 상태에 변화가 일어난다고 합니다.
AppDelegate 메서드
앱의 실행 상태가 변화할 때마다 앱 객체는 AppDelegate에 정의된 특정 메서드를 호출합니다.
AppDelegate 메서드 내부에 적절한 코드를 작성하면 개발자가 원하는 작업이 실행되도록 할 수 있습니다.
(ex. 앱이 종료되기 전에 데이터 저장, 백그라운드 상태에서 메모리 정리 등)
- application(_:willFinishLaunchingWithOptions:)
앱이 구동되어 필요한 초기 실행 과정이 완료되기 직전에 호출되는 메서드 - application(_:didFinishLaunchingWithOptions:)
앱이 사용자에게 화면으로 표시되기 직전에 호출되는 메서드
보통 앱이 실행된 후에 진행할 커스터마이징 또는 초기화 코드를 작성합니다. - applicationDidBecomeActive(_:)
실행된 앱이 화면 전면(Foreground)에 표시될 때 호출되는 메서드
앱이 Inactive 상태에 들어가면서 일이 중지된 작업이 있다면 재시작하는 코드를 여기에 작성해야 합니다.
(ex. 타이머나 스톱워치 앱의 경우, Inactive 상태로 들어가면 더 이상 화면 갱신이 이루어지지 않고 예전 화면이 유지되므로
이 메서드를 이용해서 화면에 남은 시각 등을 갱신해주어야 합니다.) - applicationWillResignActive(_:)
앱이 백그라운드로 이동 중에 호출되는 메서드
일시정지, 타이머 비활성화 등의 코드를 작성하는 것이 좋습니다. - applicationDidEnterBackground(_:)
앱이 백그라운드 상태에 진입했을 때 호출되는 메서드
이 메서드가 호출된다는 것은 미래 어느 순간에 앱이 종료된다는 의미입니다.
따라서 꼭 저장하는 사용자 데이터나, 공유 자원을 해제해 주어야 합니다.
종료된 앱이 다시 실행될 때 현재의 상태를 복구할 수 있도록 필요한 상태 정보를 이 메서드에서 저장하거나 처리하는 것이 좋습니다. - applicationWillEnterForeground(_:)
앱이 화면 전면(Foreground)으로 올라올 때 호출되는 메서드
보통 API를 통해 앱의 상태를 갱신할 때 사용됩니다. - applicationWillTerminate(_:)
앱이 종료되기 직전에 호출되는 메서드
사용자 데이터 등을 종료 전에 한 번 더 저장해두는 것이 좋습니다.
마무리
오늘은 iOS LifeCycle에 따른 상태 변화와 AppDelegate 메서드들에 대해 알아봤습니다!
전반적인 주기에 따른 메서드들이 더 많이 있으니까 공식 문서 읽어보시면 좋을 것 같아요!
참고
'iOS > iOS' 카테고리의 다른 글
[iOS] Frame과 Bounds (0) 2020.11.06 [iOS] SceneDelegate는 무엇일까? (0) 2020.11.06 [iOS] "공유하기" 기능 (Share Extension) (0) 2020.10.30 [iOS] Unit Test에 대해 간단하게 알아보자 (0) 2020.09.25 [iOS] UI 개발 시 Code Base로 개발하기 (0) 2020.09.18