從後臺開啟應用時,ViewDidAppear 不會被呼叫


在 Swift 中,當應用程式從後臺開啟時,viewDidAppear 方法不會被呼叫。在這種情況下,您必須在 AppDelegate 中使用 applicationWillEnterForeground 方法。在這篇文章中,您將看到一個關於如何在從後臺開啟應用程式時執行操作的示例。

方法

如果您從後臺開啟一個應用程式,它應該在呈現檢視之前呼叫應用程式委託的 applicationWillEnterForeground 方法。但是,如果檢視控制器的檢視已在螢幕上,或者應用程式尚未完全終止,則可能不會呼叫檢視控制器的 viewDidAppear 方法。

如果您希望確保每次檢視控制器的檢視出現時都呼叫 viewDidAppear,則可以將要在該方法中執行的程式碼放在一個單獨的方法中,並從 viewDidAppear 和 applicationWillEnterForeground 兩個方法中呼叫它。這樣,您的程式碼將在檢視控制器的檢視出現在螢幕上以及應用程式從後臺返回時都執行。

示例

當然,以下是如何實現此方法的示例:

import UIKit
class TestController: UIViewController {
    
   override func viewDidLoad() {
      super.viewDidLoad()
      initialSetup()
   }
    
   override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)
   }
    
   private func initialSetup() {
        
      view.backgroundColor = .white
      navigationItem.title = "Background Call"
        
      NotificationCenter.default.addObserver(self, selector: #selector(refreshData), name: .init("RefreshData"), object: nil)
   }
    
   @objc private func refreshData() {
      print("You need to refresh the data...")
        
      // Write code here to refresh the data
   }
}

執行上述程式碼後,您會發現當您從後臺開啟應用程式時,viewDidAppear 方法不會被呼叫。為了執行它,您可以在 AppDelegate 中實現 applicationWillEnterForeground,如下所示:

import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
   var window: UIWindow?
    
   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
      // write code here to set initial view controller programatically
      self.window = UIWindow(frame: UIScreen.main.bounds)
      let navigation = UINavigationController(rootViewController: TestController())
      self.window?.rootViewController = navigation
      self.window?.makeKeyAndVisible()
        
      return true
   }
    
   func applicationWillEnterForeground(_ application: UIApplication) {
      NotificationCenter.default.post(name: .init("RefreshData"), object: nil)
   }
}

這樣,refreshData() 方法將在檢視控制器的檢視出現在螢幕上以及應用程式從後臺返回時都被呼叫。

請注意,applicationWillEnterForeground 是應用程式委託的方法,而不是檢視控制器的方法,因此您需要在應用程式委託中實現它,並在檢視控制器例項上呼叫相應的方法。

結論

總之,iOS 中檢視控制器的 viewDidAppear 方法並不總是會在應用程式從後臺返回時被呼叫。為了確保您的程式碼在應用程式從後臺返回和檢視控制器的檢視出現在螢幕上時都執行,您可以定義一個單獨的方法來儲存要執行的程式碼,並從 viewDidAppear 和 applicationWillEnterForeground 兩個方法中呼叫該方法。這種方法對於重新整理資料、跟蹤分析或處理推送通知等用例非常有用。

更新於:2023年5月4日

1K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告