iOS

SceneDelegate에 대해서...

소재훈 2022. 3. 27. 14:22

라섹수술을 한 후에 안약넣는 시간을 종종 잊어서 안약넣을 시간을 알려주는 앱이 있으면 좋겠다고 생각했다. 간단하게 개발하는 과정에서 앱의 백그라운드에서도 푸시 알림기능을 추가하였는데, 이 푸시알림을 등록하는 시점을 어디로 잡아야할지 고민하게 되었다. 원래도 iOS앱의 라이프 사이클을 대강알고 있던 터라

 

앱이 백그라운드에 들어가면 뷰도 사라질 것이고 그럼 viewDidDisappear(_:)메서드에 푸시알림으로 추가하면 되지 않을까? 🤔


라고 생각했지만 틀린생각이였다. 기존의 AppDelegate는 process LifeCycle과 UI LifeCycle을 다루었는데, 앱을 종료하는 것은 viewDidDisappear메서드와 관련있는 UI LifeCycle 과는 관련이 없었기 때문이다.

 

나는 사용자가 앱을 종료하고 나면 그때 푸시알람을 등록해서 일정 시간이 될때마다 사용자에게 알림을 보내주고 싶었다. 그러던 중 내가 원래 공부했던 AppDelegate에서 iOS13이후 더이상 UI LifeCycle을 다루지 않는다는 사실을 알게되었고, UI Lifecycle은 SceneDelegate에서 맡게되었다는 것을 알게 되었다.

 

 

Architecting Your App for Multiple Windows - WWDC19 - Videos - Apple Developer

Dive into the details about what it means to support multitasking in iOS 13. Understand how previous best practices fit together with new...

developer.apple.com

WWDC19 Architecting YOur App for Multiple Windows세션에서 이를 설명하고 있다. 이 포스트에서 나오는 이미지도 링크의 강의 PDF파일에 있는 자료를 사용하고 있다.

 

iOS 13이상에서는 이제 앱 UI의 여러 인스턴스를 동시에 만들고 관리하며 App Switcher를 사용해서 서로 전환할 수 있다. 같은 앱을 여러인스턴스로 실행해서 다른 컨텐츠를 표시하거나, 동일한 컨텐츠를 다른 방식으로 표시할 수 있는 것이다.

위에서도 말했듯이 AppDelegate.swift는 두가지 역할을 했다.

  • Process Lifecycle 관리: 이를 통해서 프로세스가 실행되고 종료됨을 알 수 있었다.
  • UI Lifecycle 관리: UI의 State를 알 수 있게 해준다.

iOS12 까지는 AppDelegate가 위의 두가지 역할을 하고 있는 것이 맞다. 애플리케이션이 오직 하나의 프로세스 하나의 UI만 가졌기 때문이다. 하지만 iOS13 부터는 여전히 하나의 프로세스를 공유하지만 여러가지 UI 인스턴스를 가지고 Scene Session이 있을 수 있기 때문에 AppDelegate의 역할이 조금 바뀌게 되었다. AppDelegate에서 UI Lifecycle의 역할이 빠지고 SceneDelegate에서 그 역할을 담당하게 되었다.

UI state에 대한일을 이제는 Scene Delegate가 처리해준다. 이것은 기존에 AppDelegate에서 UI State작업들을 처리한 앱이 있다면 전부 SceneDelegate로 마이그레이션 해주어야 한다는 의미이다....매우귀찮아진다 ㅠㅠ

 

기존에 AppDelegate에 있던 메소드 들도 오른쪽과 같은 이름으로 변경되었다.

위에서 본 AppDelegate가 가지는 책임말고도 AppDelegate가 가지는 또다른 책임이 있다. 바로 Session LifeCycle이다.

 

이제 새로운 Scene Session이 생성되거나 삭제될때 시스템이 AppDelegate에게 알려준다는 의미이다.