[iOS]AppDelegate와 SceneDelegate

 

UIKit으로 앱을 만들다 보면 프로젝트 파일에 AppDelegate파일과 SceneDelegate파일이 만들어질 때부터 있는 것을 볼 수 있다. 이것이 무엇인지 이번엔 공부한 내용을 기록해보려 한다.

 

 

 

1. AppDelegate

 

 

AppDelegate는 앱의 생명주기(앱의 실행과 종료 등) 및 UI 라이프사이클(백그라운드 상태 등)을 모두 관리하는 객체였습니다.

 

이것들을 정리해 보자면

 

1. Not Running : 앱이 시작되기 전 상태
   
Foreground 상태
2. Active : 앱이 화면에서 실행 중인 상태
3. Inactive : 앱이 화면에서 실행 중이나 어떤 신호도 받지 않는 상태(예: 전화받는 화면)
   
4. Background 상태
: 앱이 화면에 보이지 않지만 코드를 실행하고 있는 상태
   
5. Suspend : 앱이 곧 종료될 상태

 

로 정리할 수 있다. 이 모든 것을 원래는 AppDelegate에서 관리하였다. 

 

 

 

하지만 iOS13부터 스플릿뷰(멀티 윈도우 기능)를 지원하게 되면서 UI 라이프사이클이 다양해졌고 하나의 Window가 아니라 여러 개의 Scene을 가질 수 있게 되었다. 그래서 이를 관리해 줄 객체가 필요해졌다.

 

그렇다면 iOS13 이후 AppDelegate는 어떤 역할을 할까?

 

  1. 앱의 주요 데이터 구조를 초기화
  2. scene의 환경설정(Configuration)
  3. 앱 외부에서 발생하는 알림(메모리 부족 경고, 배터리 부족 경고, 다운로드 완료 알림 등)에 대응
  4. 특정한 scenes, views, view controllers에 한정하지 않고 앱 자체를 타겟하는 이벤트에 대응
  5. Apple 푸시 알림과 같이 실행 시 요구되는 모든 서비스를 등록

 

 

처음 AppDelegate에 들어가면 아래 3개의 메서드가 존재한다.

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 앱이 사용자에게 보여지기 전 초기화를 진행하는 단계
        return true
    }

이 부분을 통해서 앱의 기본 폰트나 폰트 크기, 백그라운드의 컬러 등 앱의 기본값을 설정할 수 있다. 여기서 설정하면 하나하나 모두 폰트를 설정하고 폰트 크기를 키우고 매 뷰마다 백그라운드 컬러를 설정할 필요가 없다. (내가 강조하고 싶은 부분만 바꾸면 됨)

 

 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // 씬이 새로 만들어지면 호출되는 메서드
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

 

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // 씬이 삭제되면 호출되는 메서드
    }

위의 두 개의 메서드는 Scene을 프로그래밍적으로 생성하고 관리하는 메서드이다.

 

 

2. SceneDelegate

 


iOS13부터 AppDelegate는 UIWindow를 통해 뷰컨트롤러를 화면에 표시해 주는 기능을 더 이상 담당하지 않게 되었고,

SceneDelegate에서 UI 라이프사이클을 담당하게 되었다. 이제 SceneDelegate에서 화면이 백그라운드로 가거나 포그라운드로 돌아올 때 등 화면 상태에 관한 이벤트 처리를 담당한다.

 

 

SceneDelegate를 켜보면 아래와 같은 메서드들이 있다.

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // UISceneSession life cycle에서 가장 먼저 불리는 메소드
        // 새로운 UIWindow를 생성하고 window의 rootViewController를 설정
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // scene이 백그라운드로 돌아갔을 때 시스템이 리소스를 확보하기 위해 disconnet 할 수 있는데 이 메소드는 필요 없는 리소스를 제거하는 역할을 함
        // 디스크나 네트워크를 통해 쉽게 불러올 수 있거나 생성이 쉬운 데이터는 제거하고, 재생성이 어려운 데이터는 가지고 있게끔 함
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // WillEnterForeground 메서드 바로 다음에 호출
		// scene이 설정, 표시되고 사용할 준비를 하는 역할
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // active한 상태에서 inactive 상태로 전환될 때 호출
        // 사용 중 전화가 오는 것처럼 임시적인 상황에서 발생할 수 있음
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // scene이 세팅되고 화면에 보여지면서 사용될 준비가 완료된 상태
        // inactive -> active 전환 시 호출됨
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // scene이 포그라운드에서 백그라운드로 전환될 때 호출
        // 이후 다시 포그라운드로 복원할 수 있도록 상태 저보를 저장하거나, 데이터를 저장 하는 등의 일을 하도록 하면 됨
    }

 

 

 

 

 

 

여기까지 AppDelegate와 SceneDelegate를 알아봤는데 좀 어려운 것 같다. ㅎㅎㅎ

 

 

 

만일 틀린 부분이 있다면 알려주세요!

'# 개발 > Swift' 카테고리의 다른 글

[iOS] OpenSource와 SPM  (1) 2024.01.09
[iOS] Xcode에서 Git 사용하기  (1) 2024.01.08
[iOS] 오토레이아웃(AutoLayout)  (1) 2024.01.04
[iOS] 매개변수(Parameter)  (0) 2024.01.01
[iOS] @IBOutlet & @IBAction 그리고 옵셔널!  (1) 2024.01.01