App
App是表示应用程序结构
和行为
的协议类型
iOS 14.0+
macOS 11.0+
Mac Catalyst 14.0+
tvOS 14.0+
watchOS 7.0+
visionOS 1.0+ Beta
创建一个 APP
应用程序结构描述了应用程序的内容和行为,每个SwiftUI应用程序只有一个主应用程序结构。此示例在MyApp.swift文件中定义了其应用程序结构。让我们来看看那个文件的内容。
- 导入 SwiftUI 框架。
- 使用
@main
为应用程序提供入口并启动应用程序。应用程序的入口只有一个。 - 声明一个应用程序的结构体,并遵守
App
协议,提供应用程序的内容及其行为。 - 实现 App 协议的
body
计算属性,此属性返回应用场景的内容。场景包含定义应用程序用户界面的视图层次结构。 - 使用
WindowGroup
作为应用程序的主窗口。对于 iOS 平台通常只需要一个主窗口,但在 macOS 和 iPadOS 平台会有多个窗口。 - 在 WindowGroup 添加一个遵守
View
协议的系统视图结构或自定义的视图结构在窗口中展示。
1// MyApp.swift
2import SwiftUI
3@main // main()方法的默认实现
4struct MyApp: App {
5 var body: some Scene {
6 WindowGroup {
7 Text("Hello, world!")
8 }
9 }
10}
生命周期
ScenePhase 是SwiftUI提供的生命周期枚举,用于监控场景的各阶段变化。由于 SwiftUI 是基于 Scene 的性质,ScenePhase 只能表示 Scene 的变化。
- 通过
Environment
在应用程序的 App、Scene、View 结构体中将其声明为环境变量。 - 用
onChange(of:perform:)
方法来监听环境变量 scenePhase 的变化。 - ScenePhase的枚举值:
background
、inactive
、active
。
1struct ContentView: View {
2 @Environment(\.scenePhase) private var scenePhase
3 var body: some Scene {
4 Text("Hello").onChange(of: scenePhase) { phase in
5 switch phase {
6 case .active:
7 debugPrint("变为活跃状态")
8 case .inactive:
9 debugPrint("变为不活跃状态")
10 case .background:
11 debugPrint("进入后台")
12 @unknown default:
13 fatalError()
14 }
15 }
16 }
17}
Tip在 App 结构体中监听 ScenePhase 时,可以获得应用程序中所有场景的状态变化;在自定义的 Scene 中监听时可以获得该场景的状态变化;在自定义 View 中监听时可以获得该视图所在场景的状态变化。
在 App 中使用 UIApplicationDelegateAdaptor 属性包装器处理 UIApplicationDelegate
应用程序的其他交互事件。
-
创建 MyAppDelegate 类, 并遵守
UIApplicationDelegate
协议,实现该协议的方法。1// MyAppDelegate.swift 2class MyAppDelegate: NSObject, UIApplicationDelegate { 3 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { 4 debugPrint("App -> DidFinishLaunching") 5 return true 6 } 7}
Note实现 UIApplicationDelegate 的方法,处理应用程序的启动事件、生命周期事件、环境变化事件、远程推送事件,管理应用程序状态,配置场景,后台数据下载,与 WatchKit 交互,与 HealthKit 交互,打开指定 URL 的资源,禁止指定的应用扩展类型,处理 SiriKit 意向,处理 CloudKit 邀请,本地化键盘快捷方式,管理界面几何图形,为故事板提供窗口,提供程序主入口。
-
使用
UIApplicationDelegateAdaptor
属性包装器声明一个 appDelegate 属性,该属性的类型符合UIApplicationDelegate
委托协议。1// MyApp.swift 2import SwiftUI 3@main 4struct MyApp: App { 5 @UIApplicationDelegateAdaptor private var appDelegate: MyAppDelegate 6 var body: some Scene { ... } 7}
自定义场景
在不同的系统下使用不同的应用场景