1

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

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

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

调用这些方法中的任何一个都会暂时延迟您的应用程序的暂停,给它一点额外的时间来完成它的工作。

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

  • 如果调用 beginBackgroundTaskWithExpirationHandler 时手机锁定(即屏幕打开,应用程序既可以显示也可以在后台运行),则后台任务按预期工作并保持活动状态大约 3 分钟,然后将应用程序置于后台并且屏幕关闭。
  • 如果在调用 beginBackgroundTaskWithExpirationHandler 时手机锁定(屏幕关闭),则后台任务在屏幕关闭时不会在后台保持活动状态,并且在再次打开屏幕时会以某种方式恢复

(我在 iPhone 6、iPhone 8 Plus、iPhone 5s 上都试过 iOS 12.1.4)

我使用的方法与这里描述的非常相似,我在这里也发现另一个类似的问题。

这是后台任务的预期行为吗?如果在手机处于锁定状态时启动,操作系统是否会暂停后台任务?

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

先感谢您,

4

1 回答 1

0
于 2019-04-03T09:15:47.027 回答