[iOS] AppDelegate, SceneDelegate (iOS 13 이전 이후)

nnnyeong·2022년 8월 19일
0

iOS

목록 보기
12/17
post-custom-banner

AppDelegate와 SceneDelegate

iOS 12

  • iOS 12 이전까지는 하나의 앱에 하나의 window
  • AppDelegate 내에서 App Life Cycle, UI Life Cycle 을 모두 담당함

iOS 13

  • iOS 13 부터는 window 개념이 scene으로 대체되고 하나의 앱에 여러 scene을 가질수 있게 되었음
  • UILifecycle을 더이상 ApplDelegate에서 관리하지 않음, SceneDelegate 가 이를 대체함
  • AppDelegate 는 Session Lifecycle 역할을 하게 되었기에 scene session 에 관련된 함수가 추가됨

AppDelegate

이전에는 앱이 foreground에 들어가거나 background로 이동할 때 앱의 상태를 업데이트하는 등의 앱의 주요 생명 주기 이벤트를 관리했었지만 더이상 하지 않음!

  • 앱의 가장 중요한 데이터 구조를 초기화하는 것
  • 앱의 scene을 환경설정(Configuration)하는 것
  • 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)에 대응하는 것
  • 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것.
  • 애플 푸쉬 알림 서브스와 같이 실행시 요구되는 모든 서비스를 등록하는것.

AppDelegate 메소드

  • process변화에 호출되고 SceneDelegate는 UI적인 요소를 담당한다.
//애플리케이션이 실행된 직후 사용자의 화면에 보여지기 직전에 호출 
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)

//애플리케이션이 종료되기 직전에 호출 
func applicationWillTerminate(_ application: UIApplication)


SceneDelegate

화면에 표시되는 내용(Windows 또는 Scenes)들을 처리하고 앱이 표시되는 방식을 관리

  • Scene Session은 앱에서 생성한 모든 scene의 정보를 관리함
optional func scene(_ scene: UIScene,
      willConnectTo session: UISceneSession,
            options connectionOptions: UIScene.ConnectionOptions)
  • UISceneSession 에서 호출되는 첫번째 메소드
  • 새 UIWindow 를 만들고 루트 뷰 컨트롤러를 설정
optional func sceneWillEnterForeground(_ scene: UIScene)
  • Scene 이 시작되려고 할 때 호출된다
optional func sceneDidBecomeActive(_ scene: UIScene)
  • WillEnterForeground 메서드 바로 다음에 호출
  • scene이 설정, 표시되고 사용할 준비를 마친다
optional func sceneWillResignActive(_ scene: UIScene)
optional func sceneDidEnterBackground(_ scene: UIScene)
  • 앱이 백그라운드로 스테이징 될 때 호출
optional func sceneDidDisconnect(_ scene: UIScene)
  • Scene 이 백그라운드로 갈 때 마다 iOS 는 리소스를 확보하기 위해 Scene을 삭제하는 것을 결정할 수 있음
  • 앱이 종료되거나 실행되지 않음을 의미하지는 않지만 scene만 세션에서 연결 해제되고 활성화되지 않는다
  • iOS는 사용자가 특정 scene을 다시 foreground로 가져올 때 이 scene을 scene 세션에 다시 연결하도록 결정할 수 있다
  • 이 방법은 더 이상 사용되지 않는 리소스를 삭제하는 데 사용할 수 있다.



Scene

  • 사진에서 보라색 영역과 파란색 영역을 각각 하나의 Scene
  • 하나의 앱에도 여러개의 UI 인스턴스가 존재할 수 있음

  • 각 인스턴스는 UIWindowScene 객체로 관리됨
  • 하나의 Scene 은 앱 인스턴스의 UI 를 표현하기 위해 window, viewController 들을 포함하고 각 인스턴스에 대응되는 UIWindowSceneDelegate 객체를 가짐
  • 여러 Scene 들은 동시적으로 실행되고 하나의 앱에서 같은 메모리와 프로세스 공간을 공유한다.

같은 메모리 공간을 공유함?
두 scene에 각각 숫자를 표시하는 UILabel이 있을 때 두 변수가 동일한 메모리 공간을 차지하는것을 의미하는게 아니라 SceneDelegate 객체들이 App 단위의 하나의 메모리에서 나타나고 사라지는 scene lifecycle에 따라 관리된다는 것을 뜻하는 것 같다!



UIWindowScene

하나의 Scene 인스턴스를 관리한다는 UIWindowScene 는 무엇일까

  • 앱의 scene 인스턴스 하나를 관리하는 타입으로 해당 인스턴스의 UI를 표현하기 위해 window를 갖고있다.
  • scene의 상태가 변하면 scene 객체는 UIWindowSceneDelegate 프로토콜을 adopt하는 delegate 객체를 notify한다.


앱 실행 시 호출 메소드 순서

  1. [AppDelegate] didFinishLaunchingWithOptions

  2. [AppDelegate] configurationForSession

  3. [SceneDelegate] willConnectToSession

  • 아직 화면에는 앱이 뜨지 않은 상태이다.
  1. [SceneDelegate] scene(_:willConnectTo)
  • 여기서 window = UIWindow(windowScene: scene as! UIWindowScene)
  • 이후 화면에 앱이 등장
  1. [SceneDelegate] willResignActive

  2. [SceneDelegate] didEnterBackground

  3. [SceneDelegate] didDisconnect

  • 이후 앱 화면을 명시적으로 종료하면
  1. [AppDelegate] didDiscardSceneSceneSessions
  • scene이 didDisconnect 됐을 경우 유저의 포커스에서 벗어난 후 다시 포커스를 받은 경우 데이터를 유지 하기 위해, 이곳에서 복구관련 정보를 획득 == 한 앱을 여러 화면 띄울 수 있음



Reference

[iOS] AppDelegate와 SceneDelegate
iOS) Scenes 알아보기
[iOS - SceneDelegate] iOS13이상 버전의 SceneDelegate

profile
주니어 개발자까지 ☄️☄️
post-custom-banner

0개의 댓글