xCode에서 프로젝트 생성 시 자동으로 AppDelegate.swfit와 SceneDelegate.swift 파일을 생성한다.
iOS 13 이후에 앱의 생명 주기 관리는 SceneDelegate.swift에서 관리한다.
이번 글에서는 SceneDelegate.swift 파일을 가지고 UISceneDelegate 메소드들을 간단히 다뤄보면서
Scene이 어떻게 동작하는지 직접 확인해보겠다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let _ = (scene as? UIWindowScene) else { return }
debugPrint("willConnectTo : Scene에 앱이 추가되었습니다.")
}
func sceneDidDisconnect(_ scene: UIScene) {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
debugPrint("SceneDidDisconnect : Scene이 시스템에 의해 종료되었습니다.")
}
func sceneDidBecomeActive(_ scene: UIScene) {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
debugPrint("sceneDidBecomeActive : Scene이 Inactive 상태에서 Active 상태로 전이되었습니다.")
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
debugPrint("sceneWillResignActive : Scene이 Active 상태에서 Inactive 상태로 전이되었습니다.")
}
func sceneWillEnterForeground(_ scene: UIScene) {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
debugPrint("sceneWillEnterForeground : Scene이 Foreground로 전이되기 직전입니다.")
}
func sceneDidEnterBackground(_ scene: UIScene) {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
debugPrint("sceneDidEnterBackground : Scene이 Foreground에서 Background로 전이되었습니다.")
}
}
앱이 처음 실행 됐을 때
➡️ 앱이 처음 실행되는 경우이다.
Scene이 앱에 추가될 때 호출되는 함수인 willConnectTo 메소드가 호출 됐다.
Scene이 Foreground로 전이되기 직전이기 때문에 sceneWillEnterForeground 메소드가 호출 되었고,
이어서 Inactive 상태인 Scene이 Active 상태로 전이 되면서 sceneDidBecomeActive 메소드가 호출 되었다.
홈 화면으로 이동할 때
➡️ 앱이 실행되어있는 상태에서 시뮬레이터 홈 버튼을 눌러 홈으로 화면을 전환하거나 인디케이터를 위로 올려 슬라이드하여 홈으로 화면을 전환 했을때의 경우이다.
Active 상태에서 Inactive 상태로 전이되었으므로 sceneWillResignActive 메소드가 호출 되었고
Scene이 Foreground에서 Background 상태로 전이되었으므로 sceneDidEnterBackground로 전이되었다.
홈 화면에서 다시 앱으로 돌아갈 때
➡️ 홈 화면에서 실행되어있는 앱으로 다시 돌아갈 때의 경우이다.
Scene이 Background에서 Foreground로 다시 전이되기 때문에 직전에 sceneWillEnterForeground 메소드가 호출된다.
Scene이 Inactive 상태에서 Active 상태로 다시 전이되어 sceneDidBecomeActive 메소드가 호출된다.
앱을 스위칭 할 때
➡️ 앱이 실행되어있는 상태에서 하단의 인디케이터 바를 위로 슬라이드 하여 앱을 스위칭 할 때의 상황이다.
Acitve 상태에서 Inactive 상태로 전이되었으므로 sceneWillResignActive 메소드를 호출한다.
스위칭 화면에서 다시 앱으로 돌아왔을 때
➡️ 스위칭 화면에서 다시 앱으로 돌아왔을 때의 경우이다.
Inactive 상태에서 Active 상태로 전이되었으므로 sceneDidBecomeActive 메소드를 호출한다.
현재 앱에서 다른 앱으로 스위칭하여 앱을 실행할 때
➡️ 현재 앱에서 다른 앱으로 스위칭하여 앱을 실행할 때의 경우이다.
현재 앱 화면에서 인디케이터 바를 올려 스위칭 창으로 화면을 전환하면 Active 상태에서 Inactive 상태로 전이되므로 sceneWillResignActive 메소드가 호출된다.
다른 앱을 실행하면 Scene이 Foreground에서 Background로 전이되어 sceneDidEntrerBackground 메소드가 호출된다.
다른 앱에서 현재 앱으로 스위칭하여 앱을 실행할 때
➡️ 다른 앱에서 현재 앱으로 스위칭하여 앱을 실행할 때의 경우이다.
다른 앱 화면에서 현재 앱으로 스위칭하면 Scene이 Foreground로 전이되기 직전이므로 sceneWillEnterForeground 메소드가 호출된다.
현재 앱을 실행하면 Scene이 Inactive 상태에서 Actvie 상태로 전이되어 sceneDidBecomeActive 메소드가 호출된다.
제어센터를 내렸을 때
➡️ 상단바를 아래로 슬라이드하여 제어센터를 내렸을 때의 경우이다.
Scene이 Active 상태에서 Inactive 상태로 전이되었으므로 sceneWillResignActive 메소드가 호출된다.
제어센터를 올렸을 때
➡️ 제어센터를 올려 다시 앱으로 돌아갔을 때의 경우이다.
Scene이 Inactive 상태에서 Active 상태로 전이되었으므로 sceneDidBecomeActive 메소드가 호출된다.
iPhone 잠금 상태를 활성화할 때
➡️ 앱에서 잠금 버튼을 눌러 잠금 상태로 전환했을 때의 경우이다.
Scene이 Active 상태에서 Inactive 상태로 전이되었기에 sceneWillResignActive 메소드를 호출한다.
근데 왜 갑자기 다시 Inactive 상태에서 Active 상태로 전이하고 또 다시 Active 상태에서 Inactive 상태로 전이되는 것일까?
이 부분은 잘 모르겠다. 시간날 때 공부 해서 알아봐야겠다.
어찌 됐든 Inactive로 전이되고, Scene이 Foreground에서 Background로 전이되어 sceneDidEnterBackground 메소드를 호출한다.
iPhone 잠금 상태를 비활성화하고 앱으로 돌아올 때
➡️ 아이폰의 잠금 상태를 비활성화하고 다시 앱으로 돌아올 때의 경우이다.
Foreground 상태에로 전이되기 직전이기 때문에 sceneWillEnterForeground 메소드가 호출된다.
또 Scene이 Inactive 상태에서 Active 상태로 전이되었으므로 sceneDidBecomeActive 메소드가 호출된다.
Siri 실행할 때
➡️ 앱을 사용하던 도중 시리를 사용할 경우이다.
Scene이 Active 상태에서 Inactive 상태로 전이되었으므로 sceneWillResignActive 메소드를 호출한다.
Siri를 종료할 때
➡️ 시리를 종료할 때의 경우이다.
Scene이 Inactive 상태에서 Active 상태로 전이되었으므로 sceneDidBecomeActive 메소드가 호출된다.
앱을 종료할 때
➡️ 앱을 완전히 종료할 때의 경우이다.
앱이 종료되었으므로 sceneDidDisconnect 메소드를 호출한다.
지금까지 생명 주기를 알지 못한 상태로 소규모 프로젝트를 진행했었다. SceneDelegate.swift 파일이 무엇을 하는지 왜 있는지 몰랐었는데 이제서야 알게 되었다. 시나리오를 직접 적용하기 전에 내가 먼저 결과를 예상했었는데 한가지 경우를 제외하고 다 맞아 떨어져서 기분이 좋았다 😃 앞으로 계획 중인 토이프로젝트에서는 생명 주기에 맞는 적절한 기능을 구현해보도록 하겠다 !
✔️ iPhone 잠금 상태를 활성화할 때
Active ➡️ Inactive ➡️ Inactive why!?!!!?!?! 😡
공부를 더 해봐야겠다.. 왜지?
'iOS > iOS' 카테고리의 다른 글
[iOS] 생명주기 - ViewController LifeCycle 2 (1) | 2023.08.20 |
---|---|
[iOS] 생명주기 - ViewController LifeCycle 1 (0) | 2023.08.17 |
[iOS] 생명주기 - iOS App LifeCycle 1 (0) | 2023.08.15 |
[iOS] 네트워크 통신 - URL, URLComponents (0) | 2023.08.12 |
[iOS] 네트워크 통신 - URLSession 간단한 예제 (0) | 2023.08.10 |