CBCentralManager是否会连接过时



我知道答案名义上是"否",但是我的意思是真的 - 如果应用程序进入后台(启用了Btle Background处理),什么?24小时?在应用程序更新中?

在"重新连接到外围设备"标题下,该Apple文档描述了重新连接工作流,该工作流程首先试图重新连接到通过retrievePeripheralsWithIdentifiers:找到的先前配对的外围设备,但如果您无法连接,则再次开始扫描。您怎么知道何时没有正式超时,何时将connect -ing放弃为先前发现的外围设备?您如何知道何时开始/继续扫描该想法是在您重新恢复到它的接近距离时重新连接到先前发现的BTLE设备,而无需用户与您的应用程序进行交互?

另外,在该页面上进一步说明,某些BTLE设备可能每次供电时都会为自己发明随机标识符,因此,即使您发现了retrievePeripheralsWithIdentifiers:的一些以前配对的外围设备,您也可能无法连接到他们的名字已经改变了。在实践中,有什么BTLE设备会这样做吗?那是疯子!

这是一个棘手的回答。CoreBluetooth框架本身没有连接请求的正式超时。实际上,它将尝试尽可能长时间地连接外围。但是那是多长时间?

好吧,不幸的是,这不是很好的定义。您可以非常确信,在应用程序处于前景时,连接不会超时,但是一旦您涉及后台连接,事情就不再那么有趣了。显然,就像您提到的那样,在重新启动电话之后,待处理连接将不会保留。关于长期运行的即将到来的连接,您会在苹果的文档中发现他们告诉您选择加入州保存和修复,以确保在应用程序被暂停并最终终止时正确保留待处理的连接。如果它按照广告的方式工作,这将是很好的,但不幸的是效果不佳。经过多年的工作,我发现几乎不可能在iOS上获得可靠的背景连接。我已经报告了有关此主题的许多错误,但到目前为止,没有解决问题。

特别有一些问题,我认为您应该特别注意:

  1. 如果您的应用在终止状态时发生蓝牙状态变化事件,则状态保存和修复将完全停止工作。从本质上讲,这意味着,如果出于任何原因而出于任何原因重置蓝牙芯片(通过切换蓝牙/飞行模式/等),那么每当外围设在范围内广告时,您的应用程序将永远不会被Core Bluetooth重新启动。原因是因为每当重新启动蓝牙芯片时,您的应用程序设置的所有待处理连接都将被清除。问题在于,您的应用不会重新启动以通知此更改,因此将永远不会恢复待处理的连接。因此,您的应用程序会认为外围设备将连接,而实际上它们不会连接。对我来说,这是最严重的问题,仅此而已使Corebluetooth极其不可靠。

  2. 有时框架"卡住"状态不良(可能是通过内部种族条件或类似的)。这可以随机发生,但是您可以通过立即在didFailToconnect或DidDisconnect回调中调用ConnectPheral来轻松地复制此功能。发生这种情况时,当未设置待处理连接时,"连接状态"属性设置为"连接"。为了避免这种情况,我发现您应该至少在连接之前等待20ms左右,例如使用dispatch_fter或其他东西。

  3. 该框架在内部使用XPC连接进行解释通信,以提供蓝牙事件。在某些情况下,这将出于任何原因而破裂,并且连接将丢失。我不知道为什么会发生这种情况,但是每当发生状态时,状态保存将停止工作,您将必须手动重新推出该应用程序才能从中恢复。有时我设法在设备中捕获了Sysdiagnose日志...

  4. 使用iPhone 7,同时使用Apple Watch(配对手机)将完全从锁定屏幕后面的所有重新连接,以防当前手表未连接(范围/飞行模式/飞行模式/飞行模式/电池/或任何其他原因)。这是特别糟糕的,因为它是最近推出的!但是看来Apple Watch的某些原因比其他蓝牙外围设备具有"优先级"。

这些都是我头顶的,但是还有其他问题。关于随机地址,通常这些所谓的"随机分解"地址的外围用法。这意味着它们看起来是随机的,但实际上它们可以使用IRK(身份解决键)解决,该键通常在初始蓝牙粘合期间共享。据我所知,使用完全随机地址的设备不是很常见。

最新更新