강의에서 SceneDelegate.swift
파일을 삭제하고 빌드하길래 당연히 그래야하는 줄알고 팀프로젝트와 개인과제를 모두 그렇게 진행했다.
그러다가 갑자기 왜 그렇게 하는지 궁금해가지고 조금 찾아보았다.
SceneDelegate
삭제하나요?SceneDelegate
를 삭제하고 앱을 빌드하는 이유는 대부분 iOS 프로젝트에서 앱의 실행 및 화면 전환 방식을 간소화하거나 특정 요구사항에 맞게 최적화하려는 이유에서라고 한다. SceneDelegate
는 iOS 13부터 멀티 원도우 지원을 위해 도입된 기능인데, 그걸 사용하지 않을 거라면 삭제할 수 있다.
SceneDelegate
는 iPad의 멀티 윈도우 환경을 지원하기 위해 도입된 기능이다. 하지만 앱이 싱글스크린 방식으로 동작해도 된다면 굳이 SceneDelegate
는 필요가 없다.
개인적으로 iPad 유저로서, 자주 사용하는 앱이 멀티 윈도우를 지원하지 않아서 불편했던 경우가 있다. 그래서 이런 앱들이 SceneDelegate 기능을 활용해 멀티 윈도우를 지원한다면 더 좋겠다.
SceneDelegate
와 AppDelegate
를 함께 사용하는 구조는 코드가 분산되어 있어 관리가 복잡할 수 있다. 그래서 간소화 하기 위해 SceneDelegate
를 삭제하고, 모든 로직을 AppDelegate
에 통합하기도 한다.
iOS 12 이하에서는 SceneDelegate
가 없기 때문에, 구 버전을 지원해야하는 앱이라면 SceneDelegate
없이 동작하도록 설정해야 한다.
SceneDelegate
와 AppDelegate
가 각각 생명주기를 관리하면 복잡도가 높아질 수 있기 때문에 AppDelegate
단일 파일로 통일하면 더 직관적으로 관리할 수 있다.
SceneDelegate
파일 삭제info.plist > Application Scene Manifest
삭제SceneDelegate
는 UIApplicationSceneManifest
항목에서 설정돼서, 이를 삭제해야 한다.
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
}
}
SceneDelegate
와 AppDelegate
를 함께 관리하기멀티 윈도우 지원이 필요한 앱에서는 SceneDelegate
와 AppDelegate
를 함께 사용하면 된다. 두 파일은 서로의 역할이 나뉘어져 있다.
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
의 삭제 여부는 앱의 특성과 요구사항에 따라 다르다. 생각을 정리해보고 선택하면 좋을 것 같다.
- 간단한 프로젝트나 구형 iOS 버전 지원이 필요하다면 삭제를 선택하자.
- 반면, 멀티 윈도우 지원이 필요한 앱이라면
SceneDelegate
를 유지하고 효율적으로 관리하도록 하자.
프로젝트의 목표와 사용자 경험에 맞는 선택을 하는 것이 중요하다.
오 꿀팁!