【发布时间】:2021-06-13 16:39:59
【问题描述】:
我的任务是调试为什么某些用户在打开应用程序时有时会遇到黑屏。我是这个特定应用程序的新手,所以我不知道整个流程,但我可以看出该应用程序具有后台功能。某些任务在夜间运行。
当谈到后台模式时,我很难理解 iOS 应用的整个生命周期。
当应用程序从终止状态在后台启动时,我假设didFinishLaunchingWithOptions 仍将被调用。我看到我们在代码中对此进行了小检查,在这种情况下,它省略了整个 UI 初始化:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
/*{ Initial setup }*/
if UIApplication.shared.applicationState == .background {
// App was launched due to Background Fetch event. No need for UI.
return true
}
/*{ Start UI }*/
return true
}
我怀疑此代码会导致应用在手动打开应用时当前或最近由“系统”在后台运行时显示无 UI (从最初终止的状态)。它是否正确?这意味着在某些极端情况下,人们会在没有调用“{ Start UI }”的情况下打开应用程序。
我们还实现了applicationDidBecomeActive,我认为应该使用它来确保在这种情况下呈现 UI。但是,现在这里只有一些可达性的东西:
func applicationDidBecomeActive(_ application: UIApplication) {
reachabilityManager?.startObserving()
}
我发现的大多数在线资源都没有具体说明应用程序是如何在后台启动的,例如 this graph 在所有情况下总是转换为 didBecomeActive。
所以问题1;在didFinishLaunchingWithOptions 中评估状态的最佳实践方法是什么?在 .background 的情况下省略 UI 的当前实现是最优的吗?如果是这样,我是否应该检查一下 UI 是否在 didBecomeActive 中运行,如果不是,则启动 UI?
引出问题2;如果我们应该在 didBecomeActive 中加载 UI,我们是否也应该在 didEnterBackground 中卸载或取消分配任何活动的 UI?
额外问题:是否可以使用调试器实际重现此问题?每次我用调试器启动应用程序时,它显然不在后台。如何调试从后台到前台的生命周期?
或者我可能在这里完全偏离目标,为什么有时某些用户没有 UI 可能有不同的原因?
【问题讨论】:
-
至于如何在不启动前台进行调试,请查看Xcode Run option: Wait for the executable to belaunched。
-
@paiv 我需要的是一种从终止状态调试计划后台任务的方法。例如,根本没有真正启动应用程序。我认为您的解决方案只是等到我点击图标后才开始执行任何操作,而不是自动打开它,是吗?
-
我认为@paiv 的意思是:使用一些在不久的将来安排任务的调试代码正常启动应用程序。然后终止它。然后在 Xcode 中按照他说的做(即选择“等待启动可执行文件”,然后按运行按钮)。这将使调试器准备好在应用程序由于计划任务启动后自行附加。在那之前你只需要等待(因此我建议暂时安排一些调试代码,比如一分钟左右)。
标签: ios swift background-fetch ios-lifecycle