[TIL] 왜 SceneDelegate 삭제하나요?

Eden·2024년 12월 27일
3

TIL

목록 보기
79/92

강의에서 SceneDelegate.swift 파일을 삭제하고 빌드하길래 당연히 그래야하는 줄알고 팀프로젝트와 개인과제를 모두 그렇게 진행했다.

그러다가 갑자기 왜 그렇게 하는지 궁금해가지고 조금 찾아보았다.

그래서 왜 SceneDelegate 삭제하나요?

SceneDelegate를 삭제하고 앱을 빌드하는 이유는 대부분 iOS 프로젝트에서 앱의 실행 및 화면 전환 방식을 간소화하거나 특정 요구사항에 맞게 최적화하려는 이유에서라고 한다. SceneDelegate는 iOS 13부터 멀티 원도우 지원을 위해 도입된 기능인데, 그걸 사용하지 않을 거라면 삭제할 수 있다.

1. 멀티 윈도우 지원이 꼭 필요한가?

SceneDelegate는 iPad의 멀티 윈도우 환경을 지원하기 위해 도입된 기능이다. 하지만 앱이 싱글스크린 방식으로 동작해도 된다면 굳이 SceneDelegate는 필요가 없다.
개인적으로 iPad 유저로서, 자주 사용하는 앱이 멀티 윈도우를 지원하지 않아서 불편했던 경우가 있다. 그래서 이런 앱들이 SceneDelegate 기능을 활용해 멀티 윈도우를 지원한다면 더 좋겠다.

2. 프로젝트를 간단하게!

SceneDelegateAppDelegate를 함께 사용하는 구조는 코드가 분산되어 있어 관리가 복잡할 수 있다. 그래서 간소화 하기 위해 SceneDelegate를 삭제하고, 모든 로직을 AppDelegate에 통합하기도 한다.

3. 구 iOS버전과의 호환성

iOS 12 이하에서는 SceneDelegate가 없기 때문에, 구 버전을 지원해야하는 앱이라면 SceneDelegate없이 동작하도록 설정해야 한다.

4. UI 생명주기 관리 통합

SceneDelegateAppDelegate가 각각 생명주기를 관리하면 복잡도가 높아질 수 있기 때문에 AppDelegate 단일 파일로 통일하면 더 직관적으로 관리할 수 있다.


SceneDelegate를 삭제하고 더 간단한 프로젝트로!

1. SceneDelegate 파일 삭제

2. info.plist > Application Scene Manifest 삭제

SceneDelegateUIApplicationSceneManifest 항목에서 설정돼서, 이를 삭제해야 한다.

3. AppDelegate 수정

SceneDelegate가 사라지면 AppDelegate에서 UIWindow를 직접 관리해야 한다.

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        // UIWindow 초기화
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = ViewController() // 초기 뷰 컨트롤러 설정
        window?.makeKeyAndVisible()
        return true
    }
}

멀티 윈도우 지원을 고려한다면 이렇게

SceneDelegateAppDelegate를 함께 관리하기

멀티 윈도우 지원이 필요한 앱에서는 SceneDelegateAppDelegate를 함께 사용하면 된다. 두 파일은 서로의 역할이 나뉘어져 있다.

AppDelegate: 앱의 전역 상태 관리 (앱 생명주기, 푸시 알림, 외부 URL 처리 등).
SceneDelegate: 특정 윈도우(장면)의 UI 상태 및 화면 전환 관리.

AppDelegate 구현

AppDelegate는 앱 전역의 설정과 초기화를 관리한다.

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        print("AppDelegate: 앱이 시작되었습니다.")
        return true
    }

    func application(
        _ application: UIApplication,
        configurationForConnecting connectingSceneSession: UISceneSession,
        options: UIScene.ConnectionOptions
    ) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
}

SceneDelegate 구현

SceneDelegate는 개별적인 윈도우를 관리한다.

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(
        _ scene: UIScene,
        willConnectTo session: UISceneSession,
        options connectionOptions: UIScene.ConnectionOptions
    ) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(windowScene: windowScene)
        window?.rootViewController = ViewController() // 초기 뷰 컨트롤러 설정
        window?.makeKeyAndVisible()
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        print("SceneDelegate: 장면이 종료되었습니다.")
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        print("SceneDelegate: 장면이 활성화되었습니다.")
    }

    func sceneWillResignActive(_ scene: UIScene) {
        print("SceneDelegate: 장면이 비활성화됩니다.")
    }
}

삭제할까? 유지할까?

SceneDelegate의 삭제 여부는 앱의 특성과 요구사항에 따라 다르다. 생각을 정리해보고 선택하면 좋을 것 같다.

  1. 간단한 프로젝트나 구형 iOS 버전 지원이 필요하다면 삭제를 선택하자.
  2. 반면, 멀티 윈도우 지원이 필요한 앱이라면 SceneDelegate유지하고 효율적으로 관리하도록 하자.

프로젝트의 목표와 사용자 경험에 맞는 선택을 하는 것이 중요하다.

profile
Frontend🌐 and iOS

1개의 댓글

comment-user-thumbnail
2025년 1월 2일

오 꿀팁!

답글 달기