我有一个与BLE设备交互的iOS应用程序。 Bluetooth LE附件的后台模式处于活动状态,因此即使将应用程序置于BLE后台,该应用程序也可以与其连接并与BLE设备交互。 连接BLE设备后,应用程序将在后台执行代码以响应BLE相关的回调,但BLE设备断开连接后,该应用程序将无法在后台运行代码(该应用程序在BLE设备断开连接后仅在几秒钟内仍处于活动状态)。
我需要的是一种在BLE设备断开连接后执行有限长度任务(持续时间大约为1-2分钟)的方法。。
阅读Apple Documentation是我尝试使用beginBackgroundTaskWithExpirationHandler:方法的原因。调用此方法,应用程序应该请求一些额外的执行时间(大约3分钟)。
调用这两种方法中的任何一种都会暂时延迟应用程序的暂停,从而为完成其工作提供了一些额外的时间。
我尝试通过调用beginBackgroundTaskWithExpirationHandler来响应BLE断开回调来注册后台任务,但我发现了一个奇怪的行为,这取决于在调用beginBackgroundTaskWithExpirationHandler时是否锁定电话:
(我尝试将iPhone 6,iPhone 8 Plus和iPhone 5s与iOS 12.1.4一起使用)
我使用的方法与描述的here非常相似,我还发现了here的另一个类似问题。
这是后台任务的预期行为吗?如果手机在锁定状态下启动,操作系统是否会挂起后台任务?
是否有另一种方法可以从回调(在应用程序处于后台且手机被锁定时触发)来启动持续时间为1-2分钟的有限长度任务?
先谢谢您
答案 0 :(得分:0)
根据:
application(_:performFetchWithCompletionHandler:)
调用此方法时,您的应用最多有30秒的挂钟时间来执行下载操作并调用指定的完成处理程序块。实际上,您的应用在下载所需数据后应尽快调用完成处理程序块。如果您没有及时调用完成处理程序,则您的应用程序将终止。更重要的是,系统使用经过的时间来计算应用后台下载的耗电量和数据费用。如果您的应用需要很长的时间来调用完成处理程序,那么将来将来获取数据的机会可能会减少。
因此,您有 30秒来完成后台所需的任何任务。