3

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

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

4

2 回答 2

5

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

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

于 2013-04-24T20:05:11.463 回答
2

从技术上讲,如果您的用户不介意等待无响应的 UI,您可以在应用程序启动后同步运行长时间运行的任务。但是,用户可能会锁定他们的设备并稍后解锁。如果您的应用程序无法响应应用程序生命周期回调 (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
    });
}
于 2013-04-24T20:06:52.800 回答