app life cycle에 대해 관련되어 정리된 글이 엄청 많다.
한국어로 정리된 자료는 거의 다 읽어보고, 그중에 중요하고 좋은 내용을 내 나름대로 깔끔하게 정리해보고자 한다.
이글의 내용은 제가 만든 내용이 아닌, 원래 있던 자료들을 편하게 보기위해 정리한 글임을 다시한번 명확하게 밝힙니다.
Application Life Cycle
: iOS에서의 앱 생명주기는 아래와 같은 순서로 볼 수 있습니다.
1. 사용자 앱 아이콘 터치 실행
2. main() 메서드 실행되고, 함수 내부에서 UIApplicationMain 메서드 호출
-> 이때 your code에서 AppDelegate 클래스에 작성된 application:didFinishLaunchingWithOptions: 메소드 호출.
이 함수에 원하는 code를 작성해두면 앱이 처음 시작할때 해당 코드를 실행한다.
3. 이후 시스템 프레임워크의 event Loop가 실행되면서 사용자가 작성하는 Handle Event에 의해 custom 코드로 연결된다.
-> 여기서의 Handle event는 사용자가 만든 @iBAction.. 같은 함수를 말할수 있다.
4. 앱이 실행 목적을 모두 완료한 후, 사용되지 않으면 시스템은 앱을 메모리에서 제거.
-> 이 과정에서 AppDelegate 클래스의 applicationWillTerminate(_:) 메소드를 호출한다. 앱 종료 전에 처리해야 될 작업이 있다면, 이 메소드 내부에 custom code를 작성하면 된다.
AppDelegate와 SceneDelegate의 역할
OS13부터 바뀐 점
- 바뀌기 이전(~iOS12)
- 바뀐 후 (iOS13)
1. iOS12까지는 대부분 하나의 앱에 하나의 window였지만 iOS 13부터는 window의 개념이 scene으로 대체되고 아래의 사진처럼 하나의 앱에서 여러개의 scene을 가질 수 있습니다.
2. AppDelegate의 역할 중 UI의 상태를 알 수 있는 UILifeCycle에 대한 부분을 SceneDelegate가 하게 됐습니다.
3. 그리고 AppDelegate에 Session Lifecycle에 대한 역할이 추가됐습니다.
iOS 12까지의 동작(Scene을 지원하지 않는 경우.)
:UIKit은 모든 Life CycleDMF UIApplicationDelegate 객체에 전달한다. 앱 Delegate는 앱의 모든 window를 관리한다.
해당 그림에서 점선은 시스템이 하는것, 실선은 사용자가 하는것.
- Not Running:앱이 실행되었다가 종료되거나, 앱이 실행되지 않은 초기 상태
- Inactive: 앱이 전면(Foreground)에서 실행되고 있지만, 사용자의 동작을 받을 수 없는 상태
- 알림창을 내렸을때
- 앱 스위칭 할때
- 시스템 알림을 받을때
- Active: 앱이 전면(Foreground)에서 실행중이며, 이벤트를 받을 수 있는 상태
- Background: 앱이 백그라운드에 있지만 여전히 실행되고 있는 상태- 유튜브 프리미엄의 백그라운드 재생 기능
- Suspended: 백그라운드에서 정지된 상태-만약 메모리가 부족한 상황이라면, iOS 시스템은 앱의 전면(Forground)에 있는 앱의 여유 메모리 공간을 확보하기 위해 Suspended 상태에 있는 앱들을 특별한 알림 없이 종료한다. (Suspended -> Not Running 상태로 진입 하는 것은 알림을 따로 받지 않는다.)
AppDelegate 주요 메소드
didFinishLaunchingWithOptions
//애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
willFinishLaunchingWithOptions
//애플리케이션이 최초 실행될 때 호출되는 메소드
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
applicationWillResignActive
//애플리케이션이 InActive 상태로 전환되기 직전에 호출
func applicationWillResignActive(_ application: UIApplication)
applicationDidEnterBackground
//애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)
applicationWillEnterForeground
//애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출
func applicationWillEnterForeground(_ application: UIApplication)
applicationDidBecomeActive
//애플리케이션이 Active 상태로 전환된 직후 호출
func applicationDidBecomeActive(_ application: UIApplication)
applicationWillTerminate
//애플리케이션이 종료되기 직전에 호출
func applicationWillTerminate(_ application: UIApplication)
iOS 13이후(Scene을 지원하는 경우)
: Scene이란 개념이 생김으로써 동일한 앱 두개를 실행시킬 수 있게 되었다.
-> storyboard의 scene과는 다른 개념이니 혼동하지 말것.
- Unattached : 유저나 시스템이 앱의 새로운 scene을 요청하면 UIKit은 이를 생성하고 연결되지 않은 상태로 둔다.
- Forground Inactive/ Active : 사용자가 요청하는 Scene은 빠르게 foreground로 이동한다.
- Background : 시스템이 요청한 Scene은 이벤트를 처리할 수 있도록 background로 이동한다.
- Suspended : 유저가 앱을 닫으면 UIKit은 관련 scene을 백그라운드 상태로 이동하고 결국 suspended 된다.
Not Runnig 단계가 사라짐
IOS 13 이상에서 지원하고, 설정이 켜저있어야 이 방식을 쓸 수 있다.
Scene은 선택가능한 기능이다.
SceneDelegate 주요 메소드
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
...
}
우선 SceneDelegate는 UIWindowSceneDelegate 프로토콜을 채택하고 있고 여기서 이름으로 유추할 수 있듯이 window 화면 그리는데 관련된 작업을 수행하는 것을 알 수 있다.
willConnectTo
//iOS 12의 application (_ : didFinishLaunchingWithOptions :) 같은 기능
// scene이 앱에 추가될 때 호출
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
sceneDidDisconnect
//scene의 연결이 해제될 때 호출
func sceneDidDisconnect(_ scene: UIScene)
sceneDidBecomeActive
//app switcher에서 선택되면 inActive 상태에서 active상태로 전환
func sceneDidBecomeActive(_ scene: UIScene)
sceneWillResignActive
//active상태에서 inactive로 전환시
func sceneWillResignActive(_ scene: UIScene)
sceneWillEnterForeground
//background에서 foreground로 전환시
func sceneWillEnterForeground(_ scene: UIScene)
sceneDidEnterBackground
//foreground에서 backgRound로 전환시
func sceneDidEnterBackground(_ scene: UIScene)
결론(나의 간단한 정리)
iOS 12 이전에는 하나의 앱의 하나의 window만 존재했기 때문에 AppDelegate에서 UILifeCycle을 다 관리했음.
그러나 iOS 13 이후 scene의 등장으로 하나의 앱에 여러개의 scene을 가질수 있게 되었음.
-> scene이란 그냥 간단하게 생각해서 window를 확장시킨 버전인것 같다.
-> 따라서 기존의 Appdelegate가 관리하던 UILifeCycle을 관리하는 역할을 sceneDelegate에 넘겨주고, AppDelegate는 Process LifeCycle과 Session LifeCycle이라는 역할이 추가되었다.
앱 전체적인 부분에서의 역할(실행과 종료) -> AppDelegate
앱이 윈도우를 만들고, rootViewController를 설정하는 보여지는 화면에 관한 역할 -> SceneDelegate
전체적인 흐름
applications.didFinishLaunchingWithOptions -> applications.configurationForConnecting -> scene.willConnectTo -> ... -> applications.didDiscardSceneSessions
내가 이해한 흐름은 AppDelegate의 window관한 역할을 sceneDelegate에 넘겨주고, 그대신 UISession LifeCycle이란 기능을 추가해서, sceneDelegate가 UISession LifeCycle안에 들어가 있는 느낌?으로 이해했는데 정확히 이해한건지 모르겟다.. 더 찾아봐야 겠다.
래퍼런스 참고
https://limjs-dev.tistory.com/58
IOS Application Lifecycle
IOS에서 앱을 실행하면 어떤 과정을 통해 실행될까? C언어에 뿌리를 둔 모든 애플리케이션은 main() 함수로부터 시작된다. 이를 Entry Point라고 한다. OS가 애플리케이션 내부에 정의된 main() 함수를
limjs-dev.tistory.com
https://jouureee.tistory.com/65
[iOS] iOS13이후의 AppDelegate와 SceneDelegate
iOS 12 이전의 appDelegate의 역할 1. 하나의 앱에 하나의 window가 존재! iOS 13 이후의 appDelegate와 scenceDelegate의 역할 1. window 개념이 scene으로 대체되고 하나의 앱에 여러 scene을 가질수 있게..
jouureee.tistory.com
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
Apple Developer Documentation
developer.apple.com
'iOS' 카테고리의 다른 글
ViewController의 화면 전환 (0) | 2022.07.19 |
---|