簡體   English   中英

如果應用程序被殺死並立即打開,則不會調用 application(:didFinishLaunchingwithOptions:)

[英]application(:didFinishLaunchingwithOptions:) does not get called if apps is killed and opened immediately

我注意到,如果我從多任務視圖中終止應用程序並立即打開它,則不會調用application(:didFinishLaunchingwithOptions:)生命周期方法,但會調用 sceneDelegate 的scene(:willConnectTo:)方法。

據我所知,以上暗示該應用程序沒有被取消初始化,即使在殺死並重新打開應用程序后仍處於 memory 中。

由於上述行為, NSPersistentContainer object 仍在 memory 中,並且我的核心數據堆棧設置代碼存在於scene(:willConnectTo:)中,因此它再次被初始化並導致崩潰並出現以下錯誤:

Failed to load the Persistent Store due to: Optional(Error Domain=NSCocoaErrorDomain Code=134081 "(null)" UserInfo={NSUnderlyingException=Can't add the same store twice})

這是我的核心數據堆棧設置:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        
        // Show splash screen
        let viewController = UIStoryboard(name: "AppLoading", bundle: Bundle.main).instantiateViewController(withIdentifier: "AppLoadingViewController")
        window.rootViewController = viewController
        
        CoreDataManager.shared.setup {
            // Always present the UI from a Main Thread
            DispatchQueue.main.async {
                if AppSettings.shared.onboardingFinished {
                    self.presentHomeUI(using: window)
                } else {
                    self.presentOnboardingUI(using: window)
                }
            }
        }

         self.window = window
         window.makeKeyAndVisible()
    }
}

當應用程序被殺死並立即打開時,是否不調用application(:didFinishLaunchingwithOptions:)的這種正常行為? 另一個謎團是,至少根據我們的崩潰日志,這個問題只影響 iPhone X 及更高版本。

如果上述行為無法避免,那么哪種方法應該是 Core Data Setup 的理想場所?

這是我能夠在設備上重現的崩潰視頻: https://file.re/2021/05/07/sampleprojectappcrashvideo/

這是我創建的演示崩潰的示例項目: https://github.com/nik6018/CrashDemo (只能在 iPhone X 及更高版本上重現崩潰)

因此,我為 Apple 填寫了上述問題的 DTS,因為互聯網上的任何內容都沒有幫助我理解這個問題。

所以這就是蘋果所說的:

  • 每當應用程序從多任務菜單中滑出時,iOS 就會斷開連接並釋放場景。
  • 如果應用程序不再有場景,iOS 從 memory 殺死應用程序
  • 但是 iOS 不會立即執行上述步驟,所以如果我再次快速打開應用程序,它只會創建一個新場景並將其附加到現有應用程序實例
  • 由於我的核心數據設置在scene(:willConnectTo:)方法中,因此應用程序崩潰,因為我試圖再次初始化商店,即使 memory 中已經存在現有商店。

要解決此問題,我有 2 個選擇:

  1. 在 App Delegate 中移動我的核心數據設置

  2. 當應用程序調用sceneDidDisconnect(_:)時取消我的核心數據管理器

我選擇了選項 2。一切都按預期工作。

老實說,如果我看過 WWDC19 視頻,我就不必浪費我的 DTS 票了:(

如果他們遇到這種行為,希望這對任何人都有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM