iOS - 앱의 생명주기 (2_AppDelegate)

이한솔·2023년 9월 1일
0

iOS 앱개발 🍏

목록 보기
16/49

iOS12 이전의 AppDelegate

iOS12 이전까지는 하나의 앱에 하나의 window를 갖고 AppDelegate 내에서 App Life Cycle, UI Life Cycle을 모두 담당했다.

  • Process Life Cycle: Process 상태
  • UI Life Cycle: active, inactive, background, foreground 상태 관여



iOS13 이후의 AppDelegate & SceneDelegate

iOS13 부터는 window 개념이 scene으로 대체되고 하나의 앱에 여러 scene을 가질 수 있게 되었다. UILifecycle을 AppDelegate에서 관리하지 않고 SceneDelegate에서 관리한다.

💡 분할된 이유는?
iPad에 도입된 다중 창 지원기능이 적용된 결과 AppDelegate의 작업이 두 개로 분할되었다.



AppDelegate

앱의 전반적인 라이프 사이클을 관여하고 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)이나 특정한 객체(scene, view 등)에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응한다.

AppDelegate 메서드

// 애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

// 애플리케이션이 최초 실행될 때 호출되는 메소드
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool

// 애플리케이션이 InActive 상태로 전환되기 직전에 호출
func applicationWillResignActive(_ application: UIApplication)

// 애플리케이션이 백그라운드 상태로 전환된 직후 호출
func applicationDidEnterBackground(_ application: UIApplication)

// 애플리케이션이 Active 상태가 되기 직전, 화면에 보여지기 직전에 호출
func applicationWillEnterForeground(_ application: UIApplication)

// 애플리케이션이 Active 상태로 전환된 직후 호출
func applicationDidBecomeActive(_ application: UIApplication)

// 애플리케이션이 종료되기 직전에 호출
// 이전에는 앱이 foreground에 들어가거나 background로 이동할 때 앱의 상태를 업데이트하는 등의 앱의 주요 생명 주기 이벤트를 관리했었지만 더 이상 관리하지 않고 푸시 알림 등록, 위치 서비스, 앱종료 등과 같은 외부 서비스는 기존과 같이 계속 처리할 수 있다.
func applicationWillTerminate(_ application: UIApplication)


SceneDelegate

UISceneSession 객체를 사용하여 Scene의 상태를 관리하고 복원하는 데 사용하고 각 scene에 대한 라이프사이클 이벤트를 처리하고 해당하는 scene의 UI 및 동작을 관리한다.

SceneDelegate 메서드

 // UI창을 만들고 root view controller 를 설정하고 창으로 만든다.
 // 단 여기서 ViewController와 같은 클래스 객체를 만들어 사용할 때, 아직 viewDidLoad()는 호출되지 않는다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
 options connectionOptions: UIScene.ConnectionOptions){
   
}

// Scene이 백그라운드로 갈 때 마다 iOS 는 리소스를 확보하기 위해 Scene을 삭제하는 것을 결정할 수 있다.
// 앱이 종료되거나 실행되지 않음을 의미하지는 않지만 scene만 세션에서 연결 해제되고 활성화되지 않는다.
// iOS는 사용자가 특정 scene을 다시 foreground로 가져올 때 이 scene을 scene 세션에 다시 연결하도록 결정할 수 있다.
// 이 방법은 더 이상 사용되지 않는 리소스를 삭제하는 데 사용할 수 있다.
func sceneDidDisconnect(_ scene: UIScene){

}

// WillEnterForeground 메서드 다음에 호출되어 장면이 설정되고 표시할 준비가 되었음을 알려준다.
func sceneDidBecomeActive(_ scene: UIScene){
   
}

// 앱이 백그라운드로 전환시 실행된다.
func sceneWillResignActive(_ scene: UIScene){
   
}

// 백그라운드에서 포그라운드로 전환시 실행된다.
func sceneWillEnterForeground(_ scene: UIScene){
   
}

// 백그라운드에서 포그라운드로 전환시 sceneWillEnterForeground 이후에 실행된다.
func sceneDidEnterBackground(_ scene: UIScene){
  
}

0개의 댓글