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

Posted

技术标签:

【中文标题】在 iOS 中实现长时间运行的后台任务【英文标题】:Implementing Long-Running Background Tasks in iOS 【发布时间】:2013-05-25 07:00:54 【问题描述】:

我的客户要求我开发一些应用程序,定期检索用户位置和手机电池状态,然后将它们发送到我们的后端服务器进行数据分析,然后通过推送通知反馈。

但是通过app doc,我从apple ios dev doc了解到:

对于需要更多执行时间来执行的任务,您必须 请求特定权限以在后台运行它们,而无需 他们被停职。在 iOS 中,只允许特定的应用类型 在后台运行:

在后台向用户播放可听内容的应用, 比如音乐播放器应用

让用户了解他们的应用 随时定位,例如导航应用

支持的应用 互联网协议语音 (VoIP)

需要 下载和处理新内容

接收定期更新的应用 来自外部配件

我想知道如果我们将此应用程序包装为一些导航应用程序以便我们可以长时间运行后台任务,这是否可行? appstore 会拒绝我们的应用吗?

顺便说一句,Apple 对导航应用的定义是什么?

【问题讨论】:

询问苹果。您需要非常清楚应用程序的实用性,而不是试图掩盖它的作用。 嗨,Wain,感谢您的回复。抱歉,由于 NDA,我无法说出更多要求。我可能会向 Apple 发送邮件寻求答案。 【参考方案1】:

您可以考虑使用:

[CLLocationManager startMonitoringSignificantLocationChanges];

这将导致您的应用在位置发生显着变化时被终止,从而重新启动,允许您定期更新服务器上的详细信息,假设用户正在移动。这不需要任何特殊的背景许可。来自文档:

如果您启动此服务并且您的应用程序随后被终止,如果有新事件到达,系统会自动将应用程序重新启动到后台。在这种情况下,传递给应用程序委托的 locationManager:didUpdateLocations: 方法的选项字典包含键 UIApplicationLaunchOptionsLocationKey 以指示您的应用程序是由于位置事件而启动的。

您的另一个选择是将应用程序配置为需要在后台持续更新位置,但在不了解应用程序的主要功能的情况下,很难知道这是否会通过商店提交。

【讨论】:

嗨,塔克,感谢您的提示。我需要不断地检索电池状态,大约每 30 分钟一次。我们的应用程序主要是与实用程序和 LBS 社区混合的东西。位置是必要的,但不是核心。【参考方案2】:

https://github.com/yarodevuci/backgroundTask 在这里检查我的代码 我正在使用播放空白 wav 文件的音频播放器 在 IOS 8 上完美运行 24 小时内电池使用量约为 10% 如何使用:

var backgroundTask = BackgroundTask()
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background.

backgroundTask.stopBackgroundTask() //Stops the task

【讨论】:

以上是关于在 iOS 中实现长时间运行的后台任务的主要内容,如果未能解决你的问题,请参考以下文章

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

关于ios中后台长时间下载任务的实现与走过的坑

在iOS中的后台任务中调用Javascript函数

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

使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

在后台运行长时间运行的并行任务,同时允许小型异步任务更新前台