当应用程序进入后台时,在前台执行的长时间运行的任务被挂起

Posted

技术标签:

【中文标题】当应用程序进入后台时,在前台执行的长时间运行的任务被挂起【英文标题】:Long-running task performed in foreground is suspended when app enters background 【发布时间】:2012-11-15 10:09:02 【问题描述】:

当用户首次打开我的应用时,我需要先从服务器下载并安装一些内容,然后他们才能开始使用该应用。问题是这在 wifi 上大约需要 5 分钟,在此期间应用程序进入后台并暂停下载。

有没有办法:

在我执行下载时阻止 ios 应用进入后台 或继续在后台执行任务(即无论应用程序是在前台还是后台都执行任务)

谢谢

【问题讨论】:

【参考方案1】:

真的没关系,如果用户按下主页按钮,它会进入后台。虽然你可以做两件事来缓解这个问题:

使用beginBackgroundTaskWithExpirationHandler,让您有更多时间下载。您可以阅读here。 不要让设备闲置,使用[UIApplication sharedApplication].idleTimerDisabled = YES;。您可以阅读更多关于 here 的信息。

不管怎样,你能做的最好的事情就是告诉用户,这是一个重要的下载,他不应该退出应用程序。

【讨论】:

执行 beginBGTask 很可能不会取消除了下载文件之外什么都不做的操作...不要为此禁用 idleTimer -- 恕我直言 您可以禁用它,并在下载完成后启用它...:S Jacky Boy - 非常感谢。你搞定了。我正在使用 idleTimerDisabled = YES 命令来防止应用程序在安装过程中进入后台。这对我来说已经足够了。谢谢!【参考方案2】:

您不能将部分或全部内容包含在您的 app bundle 中,而只在首次运行时下载更改吗?

我无法想象这是一个很好的首次用户体验,而且它可能无法像这样通过 App Store 审查。

唯一允许在后台下载的第三方应用程序是加载问题内容的报亭应用程序,Apple 对它们允许作为报刊亭应用程序的内容非常严格。

【讨论】:

这是一个需要实时数据的本地副本以便它可以离线工作的应用程序 - 所以简短的回答是它必须首先执行下载。好消息是苹果已经批准了它,我只是想解决它在慢速连接时超时的问题。感谢您的意见。【参考方案3】:

在这种情况下,你不能做你想做的事。一种方法,我认为最好的也是唯一的方法是在您的应用程序变为活动状态(返回到前台状态)时恢复您的下载。此外,不要忘记注册连接通知(此 Apple 示例应用程序 http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html 中的可达性类可用于此目的)。祝你好运!

【讨论】:

我已经设法禁用了 idleTimer,这意味着我可以执行我的两个选项中的第一个。如果这不起作用,我会进行后台安装(如果它发生在后台处理的前 10 分钟,这是有效的)。感谢您的帮助。 但是,您无法确定在这 10 分钟内您的任务是否完成。也许,用户会从 bg 中杀死你的应用程序,也许当你的应用程序在做 bg 工作时连接会丢失,那怎么办? :) 所以,我真的建议你实施恢复支持。再次祝你好运;)

以上是关于当应用程序进入后台时,在前台执行的长时间运行的任务被挂起的主要内容,如果未能解决你的问题,请参考以下文章

长时间运行的后台任务完成后应用程序未挂起

运行后台任务时防止 IIS 空闲超时

应用进入前台时取消后台任务

iOS开发:后台运行以及保持程序在后台长时间运行

在 iOS 中实现长时间运行的后台任务

Linux守护进程详解