티스토리 뷰
안녕하세요 Pingu입니다.🐧
오늘은 iOS에서 앱의 생명주기에 따라 호출되는 AppDelegate 메서드들을 알아볼 계획입니다.
iOS 13 이후부터는 SceneDelegate가 생겨나서 AppDelegate가 하는 일들을 대체하는 메서드들도 생겨났는데요.
이렇게 대체된 메서드들은 아래와 같습니다.
즉 Scene을 사용하게 되면 AppDelegate의 메서드들이 호출되는 것이 아닌 SceneDelegate의 메서드들이 호출됩니다.
SceneDelegate에 대해서 더 자세히 알고 싶으시면 여기를 참고해주세요.
처음 Scene이라는 개념이 등장하며 나온 오래된 자료라 지금과는 메서드 이름도 조금 다르지만 크게 다른 것은 없는 거 같아요.
그럼 앱의 생명주기에 따라 호출되는 AppDelegate 메서드들을 하나씩 알아보도록 하겠습니다.
applicationDidBecomeActive(UIApplication), sceneDidBecomeActive(UIScene)
앱이 Active 상태가 되었을 때 호출되는 메서드입니다.
UIKit은 이 메서드를 호출해서 앱이 In-Active -> Active 상태로 변한 것을 알 수 있어요.
UIKit은 이 메서드가 호출되면 didBecomeActiveNotification이라는 Notification을 post 해서 앱 전체에서 해당 이벤트를 처리할 수 있도록 해줍니다.
applicationWillResignActive(UIApplication), sceneWillResignActive(UIScene)
앱이 Active 상태를 포기했을 때 호출되는 메서드입니다. (Active -> In-Active)
UIKit은 이 메서드를 호출하여 앱이 Active -> In-Active 상태로 변한 것을 알 수 있습니다. 홈 화면으로 나가거나 제어 센터, 알림 센터를 사용할 때 In-Active 상태가 되므로 호출됩니다. 앱에 저장되지 않은 사용자 데이터가 있다면 저장하게 됩니다. 하지만 이러한 방법보다는 특정 시점에 사용자 데이터를 저장하는 것이 좋다고 해요!
UIKit은 이 메서드를 호출 한 뒤 willResignActiveNotification이라는 Notification을 post 해서 앱 전체에서 해당 이벤트를 처리할 수 있도록 해줍니다.
applicationDidEnterBackground(UIApplication), sceneDidEnterBackground(UIScene)
앱이 Background 상태가 됐을 때 호출되는 메서드입니다. (In-Active -> Background)
UIKit은 이 메서드를 호출하여 앱이 In-Active -> Background 상태로 변한 것을 알 수 있습니다. 이렇게 백그라운드 상태가 되면 타이머를 무효화하고 앱 상태 정보를 저장하게 됩니다. applicationDidEnterBackground 메서드는 빠르게 반환되기 때문에 만약 이 메서드에서 수행할 작업이 있고 추가적인 실행시간이 필요하다면 beginBackgroundTask(expirationHandler:) 메서드를 사용하면 됩니다.
UIKit은 이 메서드를 호출 한 뒤 didEnterBackgroundNotification이라는 Notification을 post 해서 앱 전체에서 해당 이벤트를 처리할 수 있도록 해줍니다.
applicationWillEnterForeground(UIApplication), sceneWillEnterForeground(UIScene)
앱이 Foreground 상태가 됐을 때 호출되는 메서드입니다. (Background -> Foreground)
UIKit은 이 메서드를 호출하여 Background -> Foreground 상태로 변한 것을 알 수 있습니다.
UIKit은 이 메서드를 호출하기 전에 willEnterForegroundNotification이라는 Notification을 post 해서 앱 전체에서 해당 이벤트를 처리할 수 있도록 해줍니다.
applicationWillTerminate(UIApplication)
앱이 종료되기 직전에 호출되는 메서드입니다.
이 메서드는 SceneDelegate에는 존재하지 않습니다. 이 메서드가 호출된 후 앱이 종료되게 되면 메모리에서 완전히 제거됩니다. 즉 이 메서드를 호출할 때 사용자 데이터를 저장하고 타이머를 무효화하는 등의 작업을 수행해야 합니다.
UIKit은 이 메서드를 호출 한 뒤 willTerminateNotification을 post 해서 앱 전체해서 해당 이벤트를 처리할 수 있도록 해줍니다.
그럼 실제로 메서드들이 언제 어떻게 호출되는지 알아볼게요.
앱 사용 중 홈 화면으로 이동할 때
applicationWillRegisnActive -> applicationDidEnterBackground 순으로 호출되는 것을 볼 수 있어요
홈 화면에서 앱을 다시 켤 때 (Not run 상태가 아닌 Background 상태의 앱을 키는 경우)
applicationWillEnterForeground -> applicationDidBecomeActive 순으로 호출 되는 것을 볼 수 있습니다.
만약 아예 종료된 상태의 앱을 실행할 땐 applicationdDidBecomeActive만 호출됩니다.
앱 사용 중 알람 센터로 이동할 때
알람 센터로 이동 할 땐 이상하게 applicationWillResignActive -> applicationDidBecomeActive -> applicationWillResignActive 순으로 호출되는데 결국 In-Active 상태가 되긴 하지만 불필요하게 두 번 호출되는 부분이 존재했습니다.
앱 사용 중 제어 센터로 이동할 때
applicationWillResignActive -> applicationDidBecomeActive 순으로 호출됩니다.
앱을 종료할 때
앱을 종료하는 방법에는 다양한 방법이 있을 수 있겠지만 위와 같이 앱 사용 중 앱 전환기로 이동한 뒤 앱을 종료하게 되면 applicationWillResignActive -> applicationDidEnterBackground -> applicationWillTerminate 순으로 호출되었습니다.
이번 글에서는 앱의 상태변화에 따라 호출되는 AppDelegate, SceneDelegate 메서드에 대해 알아봤습니다!
해당 메서드가 호출될 때마다 Notification도 post 되니 다양한 곳에서 활용할 수 있을 거 같아요!
감사합니다.
'iOS > iOS_Memo' 카테고리의 다른 글
[iOS] Core Data 사용해보기 - 1 (0) | 2021.04.12 |
---|---|
[iOS 앱개발] NotificationCenter 사용법 (0) | 2021.02.28 |
[iOS 앱개발] Swift와 Vapor로 서버 만들기 (0) | 2021.02.11 |
[iOS 앱개발] Application의 Life Cycle 알아보기 (0) | 2021.02.05 |
[iOS 앱개발] View Controller의 Life Cycle (0) | 2021.02.04 |
- Total
- Today
- Yesterday
- 프로그래밍
- 문법
- Apple
- Combine
- DP
- Swift
- operator
- Publisher
- 알고리즘
- 자료구조
- 백준
- BFS
- System
- 동시성
- 테이블뷰
- Xcode
- 앱개발
- 코딩테스트
- OS
- 스위프트
- mac
- pattern
- operating
- OSTEP
- design
- 코테
- IOS
- 아이폰
- document
- dfs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |