티스토리 뷰

728x90
반응형

iOS13에서 Scene이라는 개념과 SceneDelegate가 등장하면서

Managing Your App's Life Cycle 문서에서

App-Based Life-Cycle Events 와  Scene-Based Life-Cycle를 나눠놓았습니다.

 

앱 생명주기와 관련 delegate 함수들에 대해 적으면서 정리합니다.

 

 

사실 완벽하게 이해는 못했지만ㅠㅠ (그래서 잘못된 설명일 수 있습니다..!!)

"개발 공부는 나선형을 그리며 앞으로 나아가는 것이다. (이해가 안되는듯 되는 듯하면서 빙빙 돌지만 앞으로 나아가고 있는것이다!!!)" 라고 과동아리 선배가 말씀하신 것을 위안삼아봅니당.. 😭

 

[1] App's Life Cycle (앱 생명주기)

1. App-Based Life-Cycle Events  (iOS 12 and earlier)

 

iOS에서 앱이 가질 수 있는 상태들은 아래와 같습니다.

 

1) Not Running

 

- 앱이 실행되지 않은 상태

- 실행되고 난 후, 시스템은 UI가 화면에 보여야한다면 앱을 inactive 상태에, 아니라면 background 상태에 둔다.

- foreground로 시작할 때 시스템은 자동으로 앱을 active상태로 전환한다.

 

2) Inactive

 

- 앱이 foreground에서 실행중이지만 아무런 이벤트를 받지 않고 있는 상태 

 

3) Active

 

- 앱이 foreground에서 실행중이며 이벤트를 받고 있는 상태

 

4) Background

 

- 앱이 background에 있으며 실행되는 코드가 있는 상태 

- 대부분 앱은 suspended상태로 이행하는 도중에 일시적으로 이 상태에 진입하지만 파일 다운로드, 업로드 등 특정 시간동안 이 상태로 남아있게 되는 경우도 있음

- 시스템이 임의로 Background 상태의 앱을 Suspended 상태로 만든다

 

5) Suspended

 

- 앱이 background에 있지만 실행되는 코드가 없는 상태

- 메모리가 부족한 상황이 오면 iOS system은 foreground에 있는 앱의 여유 메모리 공간 확보를 위해 이 상태에 있는 앱들을 특별한 알림없이 정리할 수도 있음

 

 

 

 

 

 

 

 

2. Scene-Based Life-Cycle Events  (iOS 13 and later)


[배경 지식]

 

이걸 살펴보기 전에 Specifying the Scenes Your App Supports 문서를 보고 Scene이라는 개념에 대해 먼저 살펴보겠습니다. 

우선 Scene은 앱 UI의 하나의 복사본 또는 앱 UI의 하나의 인스턴스라고 생각하면 됩니다. 

 

Scene이 등장하게 된 이유는 멀티윈도우 때문입니다..!

 

 

iOS13 이상에서 사용자는 앱 UI의 여러 복사본을 만들어서 app switcher에서 전환할 수 있습니다.

(app switcher = 홈버튼 더블클릭 또는 인디케이터바를 위로 올리면 실행중인 여러 화면들을 보여주잖아요..!! 이것을 의미합니다) 

 

아이패드에서는 앱 UI의 사본 하나를 다른 사본과 나란히 띄울 수 도 있습니다. 

앱 UI의 각 사본마다 scene object를 사용하여 화면에 표시하는 window, views, and view controllers 를 관리합니다.

 

사용자가 새로운 scene을 요청하면, UIKit은 scene object를 만들고 초기설정을 처리합니다. 

앱은 지원하는 scene types(??)과 이 scene들을 관리하는 데 사용하는 object들을 반드시 선언해야합니다. 

이 선언은 info.plist에서 정적으로 하거나 또는 런타임에서 동적으로 할 수 있다고 합니다. 

 

그리고 Scenes를 안쓸 수도 있는데,

너의 앱의 multiple copies를 동시에 보여줄려면(= 멀티 윈도우를 하고 싶다면) 꼭 써야한다! 라고 적혀있네요 

 

각각의 scene은 자신만의 라이프사이클이 있기 때문에 다른 실행 상태에 있을 수 있습니다. 

예를 들어 한 scene이 foreground에 있는동안 다른 scene은 background에 있을 수 있습니다. 


 

1) Unattached

 

- scene이 연결되지 않은 상태

 

2) Foreground Inactive

 

- App-based의 Inactive와 같음

 

3) Foregroud Active

 

- App-based의 active와 같음

 

4) Background

 

- App-based의 background와 같음

 

5) Suspended

 

- App-based의 suspended와 같음

 

 

 

 

 

 

 

[2] App-Based Life-Cycle 와 Scene-Based Life-Cycle 차이점 

App-Based Life-Cycle

 

 

 

Scene-Based Life-Cycle

 

 

1. Scene-based는 inactive, active라는 네이밍 앞에 foreground를 명시적으로 붙였다.

 

2. App-based는 not running과 suspended사이에 화살표가 있는데,

    Scene-based는 unattached와 suspended 사이 화살표가 없다

 

3. App-based는 suspended에서 inactive로 가는 화살표가 있었는데,  

    Scene-Based는 suspended에서 foreground inactive로 가는 화살표가 없다. 

 

 

 

 

[3] App's Life Cycle 관련 Delegate 함수들

1. App-Based Life-Cycle Events  (iOS 12 and earlier)

 

 

 

 

 

 

https://qiita.com/KenNagami/items/cbbe98b736fbdb24fef8

 

 

2. Scene-Based Life-Cycle Events  (iOS 13 and later)

 

AppDelegate는 scene 구성 및 삭제를 담당합니다.

(그래서 AppDelegate는 .configurationForConnecting .didDiscardSceneSessions 메소드를 필수로 구현하도록 되어있음)

 

 

SceneDelegate는 life cycle이벤트 및 상태 복원을 scene별로 관리합니다.

 

 

[AppDelegate]

 

 

 

 

[SceneDelegate]

 

 

 

https://qiita.com/KenNagami/items/cbbe98b736fbdb24fef8

 

 

 

 

 

 

 

[4] 질문

1) Multiple windows를 위해 SceneDelegate를 쓰고 싶은데, AppDelegate는 어떡하죠...?!? iOS 12이하 버전은 AppDelegate가 필요한데..ㅠㅠ 

 

 

 

 

이 함수들을 마이그레이션 하지 말고 AppDelegate와 SceneDelgate에 모두 구현하면 (두벌로 구현하면)

iOS 버전을 보고 system이 알아서 불러준다고 합니다. 

 

 

"But don't worry - if you want to adopt multiple windows support on iOS 13, 

that doesn't mean you need to drop support for 12 and before. 

If you're back deploying, you can simply keep both sets of these methods and UIKit will call the correct set at runtime."

- Architecting Your App for Multiple Windows

 

 

 

 

"UIKit은 오직 하나의 delegate object에만 notify해준다.

iOS 13이상이면 scence delegate에, iOS 12이하이면 app delegate에 알려준다" 라고 

 

Specifying the Scenes Your App Supports 문서에도 나와있네요 :-) 

 

반응형
댓글