小编Jis*_*say的帖子

iOS - BLE在背景上扫描随机冻结

更新14/08 - 3 - 找到真正的解决方案:

您可以在下面的答案中查看解决方案!

更新16/06 - 2 - 可能是解决方案:

正如Sandy Chapman在回答中的评论中所说的那样,我现在可以使用这种方法在扫描开始时检索我的外围设备:

- (NSArray<CBPeripheral *> * nonnull)retrievePeripheralsWithIdentifiers:(NSArray<NSUUID *> * nonnull)identifiers
Run Code Online (Sandbox Code Playgroud)

我实际上是想通过在扫描开始时让我的外围设备恢复并在需要时启动连接(即使它不在范围内)来使其工作.iOS将保持活着,直到找到我正在寻找的设备.

还请注意,iOS 8.x中可能存在一个错误,如果在后台有另一个使用蓝牙的发布版本的应用程序,则会不时通过扫描(我得到的消失回调)来保持应用程序的调试版本.

更新16/06:

所以我检查了retrievePeripheralsWithServices,如果在我开始扫描时连接了任何设备.当我得到错误时,我启动应用程序和我做的第一件事

- (void) applicationDidBecomeActive:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)

是检查返回数组的大小.它总是0,每次我得到错误.如果我的设备在当前运行中之前没有建立任何连接,也会发生错误.当我收到另一台设备的错误时,我也能看到我的设备广告并用第二台设备触发命令.

更新10/06:

  • 我让我的应用程序运行整晚以检查是否没有任何内存泄漏或大量资源使用,这是我在后台运行~12-14小时后的结果.内存/ CPU使用情况与我离开时完全相同.这让我觉得我的应用程序没有任何泄漏可能导致iOS关闭它以恢复内存/ CPU使用率.

资源使用分析

更新08/06:

  • 请注意,这不是一个广告问题,因为我们的BLE设备始终处于供电状态,我们使用了我们能找到的最强的BLE电子卡.
  • 在后台iOS检测时间也不是问题.我等了很长时间(20~30分钟)才确定不是这个问题.

原始问题

我目前正在开发一个处理与BLE设备通信的应用程序.我的一个限制是,只有在必须发送命令或读取数据时才必须连接到此设备.我必须在完成后尽快断开连接,以允许其他潜在用户也这样做.

该应用程序的一个功能如下:

  • 用户可以在应用程序处于后台时启用自动命令.如果在10分钟内未检测到设备,则会触发此自动命令.
  • 我的应用会扫描,直到找到我的BLE设备.
  • 为了在需要时保持清醒,我每次都重新开始扫描,因为CBCentralManagerScanOptionAllowDuplicatesKey选项无知.
  • 当它被检测到时,我正在检查最后一次检测是否超过10分钟.如果是这种情况,我连接到设备,然后写入对应于我需要的服务的特性.

目标是在用户进入范围时触发此设备.它可能会在超出范围几分钟后发生几个小时,这取决于我的用户习惯.

一切都以这种方式运作良好,但有时(似乎在随机时间发生),扫描类型"冻结".我的过程做得很好,但经过几次,我看到我的应用程序扫描,但我的didDiscoverPeripheral:回调从未被调用,即使我的测试设备正好在我的BLE设备前面.有时它可能需要一段时间来检测它,但在这里,几分钟后没有任何反应.

我以为iOS可能已经杀死我的应用程序以声明内存,但当我关闭和蓝牙时,centralManagerDidUpdateState:被称为正确的方式.如果我的应用程序被杀,那不应该是这样吗?如果我打开我的应用程序,扫描将重新启动,它将恢复生机.我还检查了iOS在180秒的活动后没有关闭我的应用程序,但事实并非如此,因为它在这段时间后运行良好.

我已经建立了我的.plist有正确的设置(蓝牙中央UIBackgroundModes).管理所有BLE处理的我的班级作为单身人士存储在我的AppDelegate中,可通过我的所有应用程序访问.我也测试过切换我正在创建这个对象的地方.目前我正在应用程序中创建它:didFinishLaunchingWithOptions:方法.我试着将它放在我的AppDelegate init中:但是如果我这样做的话,每次我在后台时扫描都会失败.

我不知道我的代码的哪一部分可以告诉你,以帮助你更好地理解我的过程.以下是一些可能有用的示例.请注意," AT_appDelegate "是一个maccro,以便访问我的AppDelegate.

// Init of my DeviceManager class that handles all BLE processing …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c background-process ios core-bluetooth

15
推荐指数
1
解决办法
3582
查看次数