iOS后台执行和防止应用程序被暂停/终止

Posted

技术标签:

【中文标题】iOS后台执行和防止应用程序被暂停/终止【英文标题】:iOS Background Execution and Preventing an App from being suspended/terminate 【发布时间】:2014-07-25 04:16:33 【问题描述】:

我正在开发一个内部分发的 ios 应用(即没有应用商店),我希望能够每隔 10 分钟报告一次设备的位置。

无论如何,我已将location 作为字段UIBackgroundModes 的键包含在我的plist 中,希望这足以让我的应用程序在后台运行,而我每10 分钟运行一次计时器。但是,我发现在某些情况下,应用程序会停止报告这些事件。我怀疑该应用程序正在进入暂停状态,甚至可能由于内存限制而终止。我使用工具分析了我的内存占用,并排除了内存分配失控是终止的原因。

如何防止系统将我的应用程序置于暂停状态?文档对位置背景模式这么说:

启用此模式不会阻止系统暂停 应用程序,但它确实告诉系统它应该唤醒应用程序 每当有新的位置数据要交付时

太好了。所以它可能会被暂停,但新的位置数据会重新唤醒它。但是如果没有新的位置数据呢?我可以防止应用程序被暂停吗?也许使用不同的背景模式?

非常感谢任何帮助!

【问题讨论】:

我想您可以使用音频播放背景模式,并在您的应用程序进入后台后开始播放无声媒体文件。根据docs,这将防止应用程序被暂停。不太适合 App Store 提交,但由于您的应用是在内部部署的,它可能适合您 即使使用很少的内存也可以终止。随着用户启动的应用程序越来越多,一旦应用程序数量超过内存,就会终止一些应用程序。有一些方法可以将自己标识为“好公民”,比如当你被要求释放记忆时,这意味着你会比“坏公民”活得更长,但最终你会被终止。 【参考方案1】:

你需要做两件事来防止位置管理器暂停,有:

self.locationManager.allowsBackgroundLocationsUpdates=true self.locationManager.pausesLocationUpdatesAutomatically = false

您可能还需要添加以下内容: self.locationManager.requestAlwaysAuthorization()

希望这会有所帮助,

【讨论】:

【参考方案2】:

你可以试试:

[[UIApplication sharedApplication] setIdleTimerDisabled: YES];

但这会很快耗尽你的电池!

【讨论】:

以上是关于iOS后台执行和防止应用程序被暂停/终止的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何判断应用程序何时暂停? [复制]

【iOS】后台播报TTS(防止APP后台被杀死)

即使应用程序处于终止状态或被杀死,如何在 iOS 中获取位置更新? [复制]

当 iOS 应用程序被暂停/杀死并且用户点击通知时如何处理 Firebase 推送通知?

如何防止主线程ios杀死后台线程

即使应用程序已注册为 VOIP,iOS9 套接字连接也会在应用程序暂停时终止