如果它变得无响应,iOS 会杀死我的应用程序吗?

Posted

技术标签:

【中文标题】如果它变得无响应,iOS 会杀死我的应用程序吗?【英文标题】:Will iOS kill my app if it becomes unresponsive? 【发布时间】:2013-04-24 19:58:01 【问题描述】:

我正在为办公室大厅安装开发一个 ios 应用程序。该应用程序只会安装在六台 iPad 上,并且永远不会通过应用程序商店分发。该应用程序需要每天下载一次大型内容文件,并且在它重新启动的任何时候。此外,该应用程序将需要预加载一堆图像,以便它们可以快速显示。整个过程需要一段时间——大约 45 秒。它足够长,以至于操作系统在启动时杀死了应用程序。我已将加载过程推迟到启动后,这似乎可行。

我现在想知道的是,我是否会遇到另一个操作系统强加的时间限制,如果运行循环的迭代需要很长时间才能返回(并且操作系统观察到应用程序没有响应),它会杀死它.是否存在这样的约束?或者,对于我的特定情况,我不需要担心用户界面无响应而烦人,只要我想在应用启动后在主线程上执行任务,我是否可以安全地花时间。

【问题讨论】:

我相信您可以将测试应用程序作为包部署到手机上。为什么不编写一个执行无限循环的应用程序并尝试一下? 你有什么理由不想在单独的线程中做这件事? 一定要在主线程中做吗?即使它只在六台设备上运行,也没有必要糟糕地实现它。 【参考方案1】:

是的。如果您阻塞主线程并且应用程序响应系统事件的时间过长,看门狗将终止您的应用程序。不过,我不相信 Apple 会给出实际时间。

更多信息在这里https://developer.apple.com/library/ios/#technotes/tn2008/tn2151.html 或谷歌0x8badf00d。这是与看门狗超时相关的异常代码。

【讨论】:

【参考方案2】:

从技术上讲,如果您的用户不介意等待无响应的 UI,您可以在应用启动后同步运行长时间运行的任务。但是,用户可能会锁定他们的设备并稍后解锁。如果您的应用无法响应应用生命周期回调(applicationWillResignActive:applicationDidBecomeActive:),它仍然可能会被终止。

请参阅此Q/A,了解有关 iOS 看门狗的技术信息 - 一个确保应用运行良好的守护进程。

请注意,当您从 Xcode 启动应用程序时,无论如何,看门狗都不会杀死它。但是一旦你从主屏幕启动了你的应用程序,看门狗就会接管它。其实跟 App Store 没什么关系。

为了安全起见,我建议您在后台线程中执行长时间运行的任务。使用[self performSelectorInBackground:withObject:] 很容易做到这一点。您还可以在 UI 中显示活动指示器,甚至显示下载文件的数量,以便用户知道某些东西正在幕后工作。

要从后台线程更新 UI,您必须调用主线程来执行更新代码。可以这样做:

- (void)methodRunningInBackground

    // some work is done here ...

    dispatch_async(dispatch_get_main_queue(), ^
         // update your UI here
    );

【讨论】:

以上是关于如果它变得无响应,iOS 会杀死我的应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从 React Native iOS 应用程序共享我的应用程序 URL 时,应用程序变得无响应

批量检测程序无响应

如果我们关闭它启动的终端,linux 会杀死后台进程吗?

Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?

使用 git log 命令后经常(但不总是), : 显示在我的终端窗口上,它只是变得无响应

Zepto JS 使我的 phonegap 应用程序中的滚动无响应