SwiftUI App生命周期管理

2,722 阅读2分钟

App

表示App的结构和行为

protocol App
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            Text("Hello, world!")
        }
    }
}
  • 在MyApp前面加上 @main 属性,表示进入App的唯一入口点。

  • @main 底层实现了App的 main()方法。

  • 在App中定义的常量、变量其生命周期与整个app是完全一致的。

  • 管理App的生命周期

Scene

Scene, 场景, 定义了 App 用户界面group(分组)。每个场景充当视图层次结构的根视图,并能够监听App的生命周期

App根据场景类型平台上下文以不同的方式呈现场景。场景可能会填满整个屏幕、部分屏幕、窗口、窗口中的选项卡或其他内容。比如相同的代码在iOS和macOS下的呈现不同

  • iOS和WatchOS中,只能呈现一个场景(窗口)。

  • 在iPadOS中(如打开多窗口支持),最多可以打开两个运行窗口(Scene),可以分屏显示,也可以全屏独立显示。

  • 在macOS中,可以打开多个窗口,并通过程序菜单中的窗口菜单来进行多窗口管理。

  • macOS 还可以支持将多个相关的窗口合并为一组,在这种情况下多个 Scene 被一个选项卡组合展示,但是这个共享的 Window 也有自己单独的 Scene, 并且将选中的子 Scene 展示出来。

WindowGroup

如果在一个WindowGroup加入多个View,呈现状态有点类似VStack。

在一个Scene中加入多个WindowGroup,只有最前面的可以被显示。

以 macOS 为例 WindowGroup 可以实例化多个 Scene,这些不同的 Scene 可以单独的响应用户的事件,虽然每个 Scene 都来自同一份 UI 定义,但是不同时刻的用户行为也会导致不同的 Scene 含有不同的状态。

App生命周期管理

import SwiftUI

@main
struct TestApp: App {

    @Environment(\.scenePhase) var scenePhase
    
    // 相当于以前的 didFinishLaunching 方法,进行初始化操作
    init() {
        print("Application is starting...")
    }
    
    var body: some Scene {
        WindowGroup {
            Text("Hello world")
        }.onChange(of: scenePhase) { newScenePhase in
            switch newScenePhase{
            case .active: // 进入前台
                print("active")
            case .background: // 进入后台
                print("background")
            case .inactive: // 不活跃状态
                print("inactive")
            default:
                print("default")
            }
        }
    }
}

SwiftUI使用ScenePhase来跟踪App的状态,使用 @Environment 属性包装器来获取当前值,用 .onChange(of:perform:) 监听更改。