티스토리 뷰

반응형

안녕하세요 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 되니 다양한 곳에서 활용할 수 있을 거 같아요!

 

감사합니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함