LifeCycle of iOS app
App's Life Cycle
import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { // 應用程式初始化 func applicationDidFinishLaunching(_ application: UIApplication) { <#code#> } // 應用程式初始化後 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } //即將啟動 Running phase func applicationDidBecomeActive(_ application: UIApplication) { <#code#> } //進入前景 (使用者使用中) func applicationWillEnterForeground(_ application: UIApplication) { <#code#> } // 使用者離開活動中 func applicationWillResignActive(_ application: UIApplication) { <#code#> } // 進入背景 func applicationDidEnterBackground(_ application: UIApplication) { <#code#> } // 閒置過久,檢查記憶體與存儲空間,如不足,被迫移除(釋放資源)。 func applicationWillTerminate(_ application: UIApplication) { <#code#> } ---------- 下方無關生命週期重要階段 ------------------------------------ // 記憶體不足提醒 func applicationDidReceiveMemoryWarning(_ application: UIApplication) { <#code#> } // 時間相關 func applicationSignificantTimeChange(_ application: UIApplication) { <#code#> } // 資料相關 func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication) { <#code#> } func applicationProtectedDataWillBecomeUnavailable(_ application: UIApplication) { <#code#> } // Auth func applicationShouldRequestHealthAuthorization(_ application: UIApplication) { <#code#> } }Download App 一旦 app 下載進入手機設備中的磁碟內時,App 的生命週期就開始了,請詳 AppDelegate。 而通常本地端的推播功能就是設計於此環節,能讓使用者在沒有網路的情況下,能接受 app 定時設計好的推送訊息。
Open App 當使用者啟動 app,進入畫面即前景 ,則畫面的生命週期便是展開,請詳 ViewController。
Press Home button 按下 Home 鍵,雖然前景畫面跑回了手機主頁,然而針對某些特殊設計的應用程式(開發者設定為可於背景執行)則地圖 app 、音樂 app、資料撈取、遠端推播 remote notification、藍芽 BLE 功能的 app 因應 CPU 資源和電池電量的資源供給量(主要供給予前景執行的 app)均能於背景(使用者即便看不見應用程式畫面)亦能執行任務,方便使用者繼續更新地圖、聆聽音樂、下載資料。
Lock Screen 使用者因為一定時間內沒有與手機互動,系統為保安全,便會鎖定螢幕,此階段與按下 Home 鍵的執行方式一樣。
View's Life Cycle
// // ViewController.swift // KatesBackgroundRunner // // Created by KatesAndroid on 2021/1/29 PM 8 // import UIKit class ViewController: UIViewController { //override var viewIfLoaded: UIView? //override var isViewLoaded: Bool // ------ 載入畫面前 ------------------ override func loadViewIfNeeded() { <#code#> } override func loadView() { <#code#> } // ------ 載入畫面後 ------------------ override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } // ------ 畫面出現 ------------------ override func viewWillAppear(_ animated: Bool) { <#code#> } override func viewDidAppear(_ animated: Bool) { <#code#> } // ------ 畫面消失 ------------------ override func viewWillDisappear(_ animated: Bool) { <#code#> } override func viewDidDisappear(_ animated: Bool) { <#code#> } // ------ 畫面傳輸 ------------------ override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { <#code#> } // ------ 與畫面生命週期無關 ------------------ override func updateViewConstraints() { <#code#> } override func viewWillLayoutSubviews() { <#code#> } override func viewDidLayoutSubviews() { <#code#> } override func viewSafeAreaInsetsDidChange() { <#code#> } }