如果在手机锁定(关闭屏幕)后启动,iOS后台任务将无法保持活动状态

时间:2019-04-03 09:01:09

标签: ios swift bluetooth-lowenergy uibackgroundtask ios-background-mode

我有一个与BLE设备交互的iOS应用程序。 Bluetooth LE附件的后台模式处于活动状态,因此即使将应用程序置于BLE后台,该应用程序也可以与其连接并与BLE设备交互。 连接BLE设备后,应用程序将在后台执行代码以响应BLE相关的回调,但BLE设备断开连接后,该应用程序将无法在后台运行代码(该应用程序在BLE设备断开连接后仅在几秒钟内仍处于活动状态)。

我需要的是一种在BLE设备断开连接后执行有限长度任务(持续时间大约为1-2分钟)的方法。。

阅读Apple Documentation是我尝试使用beginBackgroundTaskWithExpirationHandler:方法的原因。调用此方法,应用程序应该请求一些额外的执行时间(大约3分钟)。

  

调用这两种方法中的任何一种都会暂时延迟应用程序的暂停,从而为完成其工​​作提供了一些额外的时间。

我尝试通过调用beginBackgroundTaskWithExpirationHandler来响应BLE断开回调来注册后台任务,但我发现了一个奇怪的行为,这取决于在调用beginBackgroundTaskWithExpirationHandler时是否锁定电话:

  • 如果在调用beginBackgroundTaskWithExpirationHandler时未锁定手机 (即,屏幕处于打开状态,则应用可以在后台运行或在后台运行),则后台任务将按预期工作,并保持激活状态约3分钟稍后将应用程序置于后台并且屏幕关闭时。
  • 如果在调用beginBackgroundTaskWithExpirationHandler时手机被锁定(屏幕关闭),则背景任务在屏幕关闭时不会在后台保持活动状态,并且在再次打开屏幕时会以某种方式恢复< / li>

(我尝试将iPhone 6,iPhone 8 Plus和iPhone 5s与iOS 12.1.4一起使用)

我使用的方法与描述的here非常相似,我还发现了here的另一个类似问题。

这是后台任务的预期行为吗?如果手机在锁定状态下启动,操作系统是否会挂起后台任务?

是否有另一种方法可以从回调(在应用程序处于后台且手机被锁定时触发)来启动持续时间为1-2分钟的有限长度任务?

先谢谢您

1 个答案:

答案 0 :(得分:0)

根据

application(_:performFetchWithCompletionHandler:)

  

调用此方法时,您的应用最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。实际上,您的应用在下载所需数据后应尽快调用完成处理程序块。如果您没有及时调用完成处理程序,则您的应用程序将终止。更重要的是,系统使用经过的时间来计算应用后台下载的耗电量和数据费用。如果您的应用需要很长的时间来调用完成处理程序,那么将来将来获取数据的机会可能会减少。

因此,您有 30秒来完成后台所需的任何任务。