展示了一下可以用Environment獲取scenePhase
然後觀察ScenePhase的三種階段
這邊想要做到的是那種金融app很常見的保密效果
一開始用了這種寫法,但每次進到active後,RootView還是會重新生成
static let rootView = RootView()
if scenePhase == .active {
FDLSApp.rootView
} else {
Color.white
}
所以才改成用ZStack
接著想試把整個頁面模糊化
RootView()
.blur(radius: scenePhase == .active ? 0 : 10)
但不知為何會讓整個NavigationBar跑到safeArea外面
像這樣
不想花太多時間研究了...
就先打退堂鼓
最後眼尖的讀者應該有發現
我的app從背景回來時
其實有閃了一下“非禮勿視”那行字
雖然我另外加了didEnterBackground
有改善這個狀況(本來更明顯)
但無法完全解決(加了.opacity()也沒用)
若有類似WillEnterForeground的東西應該比較方便
這小節的內容對應Flutter的AppLifecycleState☘️☘️☘️
下方有對照表可參考
若要了解更詳細的App Life Cycle可以看這邊
View的話就不像Scene有個enum
而是用.onAppear() 跟 .onDisappear() 兩個Modifier
值得注意的是appear是顯示之前呼叫,disappear是消失之後呼叫
而.onChange()之前的文章也有用過,是用來觀察State的變化
看來似乎是在appear期間才會呼叫
最後一個超簡單小範例
展示如果有些輕量/不敏感的資料要存在app
可以用@AppStorage
它是UserDefault的再一層封裝(透過Property Wrapper)
可以很方便地在SwiftUI裡使用
不用再set來get去
深入暸解點我
App生命週期
iOS | Android | Flutter | SwiftUI |
---|---|---|---|
WillEnterForeground | onRestart | ||
DidBecomeActive | onStart | resumed | active |
WillResignActive | onPause | inactive | |
DidEnterBackground | onStop | paused | background |
View生命週期
iOS | Android | Flutter | SwiftUI |
---|---|---|---|
init | onCreate | createState | init |
viewDidLoad | initState | ||
viewWillAppear | onStart | .onAppear() | |
viewDidLayoutSubviews | build | body | |
viewDidAppear | onResume | ||
viewWillDisappear | onPause | ||
viewDidDisappear | onStop | .onDisappear() | |
removeFromSuperview | deactivate | ||
deinit | onDestroy | dispose |
本地儲存
iOS | Android | Flutter | SwiftUI |
---|---|---|---|
UserDefault | SharedPreferences | SharedPreferences | AppStorage |
Android版:iOS Developer Learning Android. Lesson 04 - Activity (了解祂的生老病死)
Flutter版:iOS Developer Learning Flutter. Lesson19 Life Cycle
https://github.com/mark33699/FDLS