[英]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,因為互聯網上的任何內容都沒有幫助我理解這個問題。
所以這就是蘋果所說的:
scene(:willConnectTo:)
方法中,因此應用程序崩潰,因為我試圖再次初始化商店,即使 memory 中已經存在現有商店。要解決此問題,我有 2 個選擇:
在 App Delegate 中移動我的核心數據設置
當應用程序調用sceneDidDisconnect(_:)
時取消我的核心數據管理器
我選擇了選項 2。一切都按預期工作。
老實說,如果我看過 WWDC19 視頻,我就不必浪費我的 DTS 票了:(
如果他們遇到這種行為,希望這對任何人都有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.