[iOS] AppDelegate, SceneDelegate

loinsir·2021년 7월 30일
0

iOS

목록 보기
4/11
post-thumbnail
  • 필자는 앱에서 NavigationController를 이용해서 화면전환을 시도했으나 AppDelegate에 NavigationController를 생성하는 강의 자료와는 맞지 않았다.

  • 이를 해결하기위해 Xcode에서 프로젝트를 생성하면 기본으로 AppDelegate.swift 파일과 SceneDelegate.swift 파일에 대해 알아보려고 한다.

AppDelegate.swift

  • 엔트리포인트인 @main을 통해 앱이 시작되는 진입점을 확인할 수 있다.
import UIKit

@main // Application Lifecycle의 시작점
class AppDelegate: UIResponder, UIApplicationDelegate {
  • 때문에 네트워크 연결 구축이나 데이터베이스 초기 접근 설정과 같은 앱 초기에 해야 할 초기화 작업을 작성하는데 좋다.

  • didFinishLaunchingWithOptions 메서드는 초기화 코드를 추가하는데 좋은데 앱이 실행된 후에 맨처음 호출되는 메서드이다.

  • iOS 13 이후 AppDelegate의 역할 중 UI의 상태를 알 수 있는 UILifeCycle에 대한 부분이 SceneDelegate로 넘어갔다.

  • 대신 Session LifeCycle에 대한 부분이 추가되었다.

SceneDelegate.swift

  • 원래 iOS 13이전에는 디폴트로 앱은 단 하나의 window만 갖고있었으나 이후 다중 윈도우가 지원되면서, 정확히 말하자면 window라는 개념이 scene으로 대체 되었고, AppDelegate의 역할 중 UI LifeCycle이 SceneDelegate로 옮겨갔다.

    • 이전
    • 이후
  • 여러 화면 모두는 동일한 UIApplication 객체를 공유한다

  • 새로운 화면 객체가 앱에 추가될 때마다 willConnectTo 가 호출된다.

    Scene?

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

  • 역할이 분리된 대신에 각 Scene들은 AppDelegate에서 Scene Session을 통해 scene에 대한 정보를 받는다....고 한다는데.... 잘모르겠다 AppDelegate는 좀더 상위 중계자 같은 느낌이 되고 대신 각자 Scene의 UI 들은 각자가 알아서 SceneDelegate에서 해결하는 느낌?

문제 해결

  • 때문에 기존에 AppDelegate에 선언된 UIWindow 객체가 사라지고 SceneDelegate로 옮겨 갔다. 실제로 SceneDelegate 파일을 여니 UIWindow 객체가 선언되어 있었다.
  • 그리고 이곳 scene 함수에 네비게이션컨트롤러를 선언했다.
  • 해결되었다.

참고 도서: SwiftUI 기반의 iOS 프로그래밍, 닐스미스 저
참고 출처: https://lena-chamna.netlify.app/post/appdelegate_and_scenedelegate/

profile
학생입니다

0개의 댓글