先偷一張蘋果畫的圖來鎮樓。
iOS 中的生命週期包含多個階段,像是 active, inactive, background, suspended 等等,這些階段標示了 app 在系統中的變化,因此可以在不同時間點去處理不同事件。傳統 UIKit 是用 AppDelegate 和 SceneDelegate 來監控,底下有 applicationDidBecomeActive, applicationDidEnterBackground 等方法,而 SwiftUI 比較不一樣,會在 @main 當中使用 @Environment(.scenePhase) 來處理,使用起來像是:
@main
struct TheApp: App {
@Environment(\.scenePhase) var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
}
.onChange(of: scenePhase) { newPhase in
switch newPhase {
case .active:
// ...
case .inactive:
// ...
case .background:
// ...
default:
break
}
}
}
}
通過對不同生命週期的處理,可以去優化 app 的效能。而不動 framework 有時候也有自己的生命週期,這就需要更進一步的研究了。