更新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:
更新08/06:
原始问题
我目前正在开发一个处理与BLE设备通信的应用程序.我的一个限制是,只有在必须发送命令或读取数据时才必须连接到此设备.我必须在完成后尽快断开连接,以允许其他潜在用户也这样做.
该应用程序的一个功能如下:
目标是在用户进入范围时触发此设备.它可能会在超出范围几分钟后发生几个小时,这取决于我的用户习惯.
一切都以这种方式运作良好,但有时(似乎在随机时间发生),扫描类型"冻结".我的过程做得很好,但经过几次,我看到我的应用程序扫描,但我的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)