我正在开发一个用于办公大厅安装的iOS应用程序。该应用程序仅安装在六台iPad上,不会通过应用程序商店分发。该应用程序需要每天下载一个大型内容文件,并在任何时候重新启动。此外,该应用程序将需要预加载一堆图像,以便它们可以快速显示。整个过程需要一段时间 - 大约45秒左右。它足够长,以便os在启动时杀死应用程序。我已经将加载过程推迟到启动之后,这似乎有效。
我现在想知道的是,我是否会遇到另一个操作系统强加的时间限制,如果运行循环的迭代需要太长时间才能返回(并且操作系统观察到应用程序没有响应)它会杀死它。这样的约束是否存在?或者,对于我的特定情况,我不需要担心烦人的用户使用无响应的用户界面,只要我想在应用程序启动后在主线程上执行任务,我是否可以放心使用。
答案 0 :(得分:4)
是。如果您阻止主线程并且应用程序花费太长时间来响应系统事件,监视程序将终止您的应用程序。我不相信Apple说的是实际时间。
此处有更多信息https://developer.apple.com/library/ios/#technotes/tn2008/tn2151.html或Google 0x8badf00d
。这是与看门狗超时相关的异常代码。
答案 1 :(得分:2)
从技术上讲,如果您的用户不介意等待无响应的用户界面,则可以在应用启动后同步运行长时间运行的任务。但是,用户可以锁定他们的设备并在以后解锁。如果您的应用无法响应应用生命周期回调(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
});
}