繁体   English   中英

如果它变得没有响应,iOS会杀死我的应用吗?

[英]Will iOS kill my app if it becomes unresponsive?

我正在开发一个用于办公大厅安装的iOS应用程序。 该应用程序仅安装在六台iPad上,不会通过应用程序商店分发。 该应用程序需要每天下载一个大型内容文件,并在任何时候重新启动。 此外,该应用程序将需要预加载一堆图像,以便它们可以快速显示。 整个过程需要一段时间 - 大约45秒左右。 它足够长,以便os在启动时杀死应用程序。 我推迟了启动后的加载过程,这似乎有效。

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

是。 如果您阻止主线程并且应用程序花费太长时间来响应系统事件,监视程序将终止您的应用程序。 我不相信Apple说的是实际的时间。

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

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

有关iOS监视程序的技术信息,请参阅此Q / A - 这是一个确保应用程序运行良好的守护进程。

请注意,当您从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
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM