**블로그 이전했습니다!

이 글은 이곳에서 확인할 수 있습니다!**

← 오늘 주제를 요약하는 사진

Xcode에서 프로젝트를 생성하면 자동으로 추가되어있는 swift 파일 중에 AppDelegate.swiftSceneDelegate.swift 파일이 있어요!
오늘은 이 두 swift 파일에 있는 AppDelegate클래스와 SceneDelegate클래스에 대해서 알아보려고 합니다 😁

AppDelegate와 SceneDelegate

사전 지식 (용어)

1.객체 (Object): 클래스의 인스턴스.
2.인스턴스 (Instance): 클래스(즉, 객체)나 구조체, 열거형의 구체적인/특정한 발생(A specific occurrence)
3.클래스 (Class): 특정한 타입의 객체에 공통되는 동작과 속성을 묘사한 코드 조각으로 본질적으로 객체의 청사진을 제공.
(Start Developing iOS Apps (Swift)- iOS and Swift Terminology Glossary 참고)

iOS13부터 바뀐 점

  • 바뀌기 이전(~iOS12)
  • 바뀐 후 (iOS13)

    (사진은 wwdc 2019 영상에서 가져왔습니다)

1. iOS12까지는 대부분 하나의 앱에 하나의 window였지만 iOS 13부터는 window의 개념이 scene으로 대체되고 아래의 사진처럼 하나의 앱에서 여러개의 scene을 가질 수 있습니다.

2. AppDelegate의 역할 중 UI의 상태를 알 수 있는 UILifeCycle에 대한 부분을 SceneDelegate가 하게 됐습니다.

3. 그리고 AppDelegate에 Session Lifecycle에 대한 역할이 추가됐습니다.

Scene Session이 생성되거나 삭제될 때 AppDelegate에 알리는 두 메소드가 추가됐는데요.
Scene Session은 앱에서 생성한 모든 scene의 정보를 관리합니다.

iOS 13부터는 window의 개념이 scene으로 대체됐다고 하는데요! 그럼 Scene은 뭘까요?

Scene?

UIKit는 UIWindowScene 객체를 사용하는 앱 UI의 각 인스턴스를 관리합니다. Scene에는 UI의 하나의 인스턴스를 나타내는 windows와 view controllers가 들어있습니다. 또한 각 scene에 해당하는 UIWindowSceneDelegate 객체를 가지고 있고, 이 객체는 UIKit와 앱 간의 상호 작용을 조정하는 데 사용합니다. Scene들은 같은 메모리와 앱 프로세스 공간을 공유하면서 서로 동시에 실행됩니다. 결과적으로 하나의 앱은 여러 scene과 scene delegate 객체를 동시에 활성화할 수 있습니다.
(Scenes - Apple Developer Document 참고)

UI의 상태를 알 수 있는 UILifeCycle에 대한 역할을 SceneDelegate가 하게 됐죠! 역할이 분리된 대신 AppDelegate에서 Scene Session을 통해서 scene에 대한 정보를 업데이트 받는데요! 그럼 Scene Session은 뭘까요??

Scene Session?

UISceneSession 객체는 scene의 고유의 런타임 인스턴스를 관리합니다. 사용자가 앱에 새로운 scene을 추가하거나 프로그래밍적으로 scene을 요청하면, 시스탬은 그 scene을 추적하는 session 객체를 생성합니다. 그 session에는 고유한 식별자와 scene의 구성 세부사항(configuration details)가 들어있습니다. UIKit는 session 정보를 그 scene 자체의 생애(life time)동안 유지하고 app switcher에서 사용자가 그 scene을 클로징하는 것에 대응하여 그 session을 파괴합니다. session 객체는 직접 생성하지않고 UIKit가 앱의 사용자 인터페이스에 대응하여 생성합니다. 또한 위 3번에서 소개한 두 메소드를 통해서 UIKit에 새로운 scene과 session을 프로그래밍적 방식으로 생성할 수 있습니다.
(UISceneSession - Apple Developer Document 참고)

그럼 SceneDelegate가 추가된 iOS13에서 AppDelegate는 어떤 일을 할까요??

iOS13부터 AppDelegate가 하는 일?

이전에는 앱이 foreground에 들어가거나 background로 이동할 때 앱의 상태를 업데이트하는 등의 앱의 주요 생명 주기 이벤트를 관리했었지만 더이상 하지 않습니다.
현재 하는 일은
1. 앱의 가장 중요한 데이터 구조를 초기화하는 것
2. 앱의 scene을 환경설정(Configuration)하는 것
3. 앱 밖에서 발생한 알림(배터리 부족, 다운로드 완료 등)에 대응하는 것
4. 특정한 scenes, views, view controllers에 한정되지 않고 앱 자체를 타겟하는 이벤트에 대응하는 것.
5. 애플 푸쉬 알림 서브스와 같이 실행시 요구되는 모든 서비스를 등록하는것.
입니다.

(UIApplicationDelegate - Apple Developer Document 참고)


AppDelegate 클래스는 새로운 프로젝트를 생성할 때마다 자동으로 생성됩니다. 저는 이 AppDelegate 클래스가 채택하고 있는 UIApplicationDelegate에 들어가 봤는데요. 위 사진과 같은 메소드들이 있었습니다.
보통의 경우, 앱을 초기화하고 앱레벨의 이벤트에 반응하기 위해서는 Xcode가 제공하는 이 클래스를 사용해야 합니다. UIApplicationDelegate 프로토콜은 앱을 설정하고, 앱의 상태 변화에 대응하며, 다른 앱 레벨의 이벤트를 처리하는 데 사용하는 여러 가지 메소드를 정의합니다.

Deployment Target이 iOS 13 미만인 상황에서는?

Deployment Target이 iOS 13 미만인 상황에서도 UIScene과 UISceneDelegate를 사용할 수 있을까요? 만약 앱이 iOS 13 미만의 버전도 지원해야 한다면 어떻게 해야할까요?

iOS 12 이하는 하나의 앱에 하나의 window를 가지고 있기 때문에(즉, multi window를 사용하지 않기 때문에) iOS 13에서 추가된 부분을 삭제하고 이전 버전(~iOS12)과 설정을 똑같이 바꿔주면 이전 방식대로과 동일하게 할 수 있습니다.
방법은 Xcode를 새로 열고

  1. iOS13에서 새로 생긴 SceneDelegate.swift 파일 삭제
  2. iOS13에서 AppDelegate에 추가된 UISceneSession과 관련된 두 메소드 삭제
  3. iOS13에서 SceneDelegate로 옮겨진 window 프로퍼티를 AppDelegate로 다시 옮기기
    var window: UIWindow?
  1. info.plist에서 Scene과 관련된 Manifest인 Application Scene Manifest 삭제

직접 해봤는데 Build Success가 뜨네요! iOS13 미만인 경우 이렇게 하면 될 것 같습니다.

참고한 자료

  1. DevelopiOSAppsSwift - BuildABasicUI
  2. iOS ) AppDelegate.swift의 역할 - zedd님 블로그
  3. Architecting Your App for Multiple Windows - wwdc 2019
  4. SceneDelegate (1) - Architecting Your App for Multiple Windows - zedd님 블로그
  5. SceneDelegate와 AppDelegate part 1 [번역]
  6. Scenes - Apple Developer Document
  7. UIscenesession - Apple Developer Document
  8. UIApplicationDelegate - Apple Developer Document

도움 주신 분
야곰
감사합니다🙏

애플 공식문서를 번역해봤는데 오역이 있을 수 있습니다 😢
궁금한 점, 틀린 내용, 오타 지적, 오역 지적, 칭찬, 격려 등 모두 환영합니다! 댓글로 남겨주세요!
읽어주셔서 감사합니다! 😊 🙏

profile
개발 공부하고 있어요!

7개의 댓글

comment-user-thumbnail
2020년 4월 9일

도움 많이 되었습니다. 감사합니다.

1개의 답글
comment-user-thumbnail
2020년 7월 21일

도움많이 됐습니다.
고맙습니다.

답글 달기
comment-user-thumbnail
2020년 10월 6일

감사합니다

답글 달기
comment-user-thumbnail
2021년 1월 18일

감사합니다!

답글 달기
comment-user-thumbnail
2021년 5월 26일

도움 되었어요 :-) 감사합니다

답글 달기
comment-user-thumbnail
2021년 8월 13일

많은 도움이 되었어요!

답글 달기