@main
struct HelloSwiftUIAppApp: App {
var body: some Scene {
DocumentGroup(newDocument: HelloSwiftUIAppDocument()) { file in
ContentView(document: file.$document)
}
}
}
- body속성에서 리턴하는 객체는 반드시
Scene
프로토콜을 구현해야 한다.
- 여기서는
DocumentGroup
이 Scene
이다.
- 문서기반 앱을 사용할때는
DocumentGroup
을 사용하며, 기본적으로는 WindowGroup
을 기본 앱을 만들 때 사용한다.
- ios, watchOS : Window를 화면 전체에 표시
- ipadOS, macOS: Window를 여러개의 윈도우를 한 번에 표시 가능
WindowGroup과 DocumentGroup의 차이

Scene에서의 작업
코드의 가독성을 위해 별도의 커스텀 Scene 구현
@main
struct HelloSwiftUIAppApp: App {
var body: some Scene {
MyScene()
}
}
struct MyScene: Scene {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Scene의 상태에 따라 원하는 작업을 실행
struct MyScene: Scene {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
ScenePhase
라는 시스템 공유 객체를 통해 확인 가능
- Scene의 상태가 바뀔때마다 속성에 저장되는데
active
, inactive
, background
중에 하나가 저장된다.
active
: 화면에 표시된 상태에서 터치이벤트와 같은 이벤트 처리 가능
inactive
: 화면에 표시되어있지만 이벤트 처리 불가
background
: 화면 표시 X 백그라운드 상태
상태가 바뀔때마다 어떤 코드를 실행하고싶다면?
struct MyScene: Scene {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { oldPhase, newPhase in
if newPhase == . background {
}
}
}
}
- 윈도우그룹 위에
onChange
모디파이어 사용
- scene은 OS에 따라 여러 인스턴스를 만들 수 있기 때문에 상태를 확인할 때 주의해야 한다.
- scene이 2개 이상이면 리턴값이 달라진다.
- 앱에 포함된 scene중에 하나라도 active라면 active를 리턴.
- 만약 a씬이 inactive라 하더라도 b씬이 active라면 active가 리턴된다.
- 모든 씬이 inactive여야지만 inactive 리턴