我的应用程序的一些iOS用户(其中一个带有iOS 9.3.2的iPhone 6)报告说,在强制退出应用程序时,他们会看到只有Apple徽标和重启栏的黑屏,以及他们的设备将重启。我自己的设备不会重现这一点,我也没有收到任何崩溃报告,因此我无法跟踪此问题。用户的印象是他们的手机或应用程序已崩溃。
重播的步骤
我确实在应用上运行了后台位置更新,以及后台进程。我已经尝试在应用程序重新进入前台时结束此后台任务,但这并不会阻止" apple徽标"屏幕显示已经看到此效果的用户。
答案 0 :(得分:0)
虽然没有堆栈跟踪因此很难识别,但下面最终成了我的问题。我正在记录它,以防其他人遇到类似的东西。
如前所述,我正在创建后台进程。这就是我使用它们的方式:
旧方式:
我在我的位置经理的顶部声明了这一点:
private var bgId: UIBackgroundTaskIdentifier!
然后,在locationManager(_:didUpdateLocations:)
内,我包括以下几行:
self.bgId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { _ in
UIApplication.sharedApplication().endBackgroundTask(self.bgId)
}
这是为了让应用程序在后台保持活着,因为位置读数已经进入。我认为,因为我使用bgId
的单个引用,后台任务将被覆盖,只有一个会无论位置更新多么频繁,都存在。
新方法:
首先,我使bgId
成为可选:
private var bgId: UIBackgroundTaskIdentifier?
然后,我将locationManager(_:didUpdateLocations:)
中的早期代码段替换为:
if self.bgId == nil {
self.bgId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { _ in
if let bgId = self.bgId {
UIApplication.sharedApplication().endBackgroundTask(bgId)
self.bgId = nil
}
}
}
iOS实际上可能会创建大量的后台进程而不是像我想象的那样覆盖它们。如果是,则此方法创建的流程要少得多。
进行此更改后,在我的问题中执行此过程时,我不再看到Apple徽标的“respring”效果并重新启动栏。