【问题标题】:iOS: Apple logo + Restart screen after Force QuitiOS:强制退出后的 Apple 标志 + 重启屏幕
【发布时间】:2016-07-15 00:02:42
【问题描述】:

我的应用程序的一些 iOS 用户(使用 iOS 9.3.2 的 iPhone 6)报告说,在强制退出应用程序时,他们将看到只有 Apple 徽标和重启栏的黑屏,并且他们的设备将重新启动。我自己的设备无法重现此问题,并且我没有收到任何崩溃报告,因此我无法追踪此问题。用户认为他们的手机或应用程序已崩溃。

复制步骤

  1. 打开应用
  2. 按下 iPhone 上的主页按钮,然后让应用程序进入后台约 20 分钟。
  3. 重新打开应用
  4. 双击主页按钮并滑动以强制退出应用
  5. 一些用户报告说此时黑屏只有 Apple 标志和重启栏。

我确实在应用程序上运行了后台位置更新,以及后台进程。我曾尝试在应用重新进入前台时结束此后台任务,但这并不会阻止已经看到此效果的用户显示“苹果徽标”屏幕。

【问题讨论】:

  • 我认为是iOS的bug。
  • 他们使用的是 iOS 10 吗?
  • 至少有一个用户在使用 iOS 9。我认为这也是 iOS 的一个错误。但是如果我能找到触发错误的原因,也许我可以避免那件事,即使我不是自己造成的?
  • 您是否正在使用 OpenGL 或其他更底层的东西做任何事情,并且可能与 GPU 或其他子系统挂钩?
  • @ZevEisenberg 应用程序中没有 OpenGL 或 GPU 操作。位置更新和后台任务是我的应用程序所做的唯一“有趣”的事情。除此之外,通常的 UI 和网络。

标签: ios


【解决方案1】:

虽然没有堆栈跟踪,所以很难识别,但下面是我的问题。我正在记录它以防其他人遇到类似的情况。

如前所述,我正在创建后台进程。这就是我使用它们的方式:

老办法:

我在我的位置管理器顶部声明了这一点:

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:) 中的早期代码 sn-p 替换为:

if self.bgId == nil {
  self.bgId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler { _ in
    if let bgId = self.bgId {
      UIApplication.sharedApplication().endBackgroundTask(bgId)
      self.bgId = nil
    }
  }
}

iOS 可能实际上创建了大量后台进程,而不是像我想象的那样覆盖它们。如果属实,这种方法会创建更少的进程。

进行此更改后,我在执行问题中的程序时不再看到苹果徽标和重启栏的“重生”效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多