0

我已经实现了恢复功能CoreBluetooth并且它工作正常,除了一件事 - 在后台一周后(+/- - 不确定 100%),没有打开,应用程序终止并且不再在任何基于 BLE 的事件上恢复(经过测试几次)。

我还将日志记录添加到所有与 BLE 相关的任务中,添加用于捕获崩溃的分析,额外跟踪恢复过程/事件 - 在检查此日志/信息/报告后 - 没有发现任何异常或可以终止我的应用程序的东西。

问题是 - 有人可以解释我为什么会出现这种行为吗?

4

2 回答 2

1

根据我对 CoreBluetooth 状态保存和恢复的经验,我得出的结论是它不能可靠地工作。你可以让它“正常”地工作,但在后台使用长时间运行的挂起连接时,你永远不会让它可靠地重新连接。

我已经报告了几个与此相关的错误,但我认为最严重的一个是如果蓝牙管理器在应用程序终止时切换状态,那么所有待处理的连接都将丢失(因为模块或 iOS 堆栈不会记住它们) . 由于蓝牙状态切换不会导致您的应用程序重新启动,因此这仅意味着在任何时候您的挂起连接都可能丢失并且您不会知道它。这本身就意味着状态恢复是相当无用的。你可以说这不是一个错误,而是一个糟糕的设计选择……</p>

另一个原因是,有时框架会“卡”在糟糕的状态(可能是由于内部竞争条件或类似情况)。这可以随机发生,但您可以通过在 didFailToConnect 或 didDisconnect 回调中立即调用 connectPeripheral 来轻松重现此情况。发生这种情况时,connectionState 将设置为正在连接,而实际上并非如此。

等等……</p>

/安东

于 2017-03-16T13:05:34.090 回答
1

蓝牙相关的问题真的很难识别。过去我们遇到了几个无法解释的错误。确定 BLE 不再工作或行为异常的唯一方法是查看设备上的 CoreBluetooth 日志。

如果您还没有尝试过,您可以通过可以从Apple 开发人员页面下载的配置文件启用这些日志(查找蓝牙并按照说明进行操作)。

启用日志记录后,您可以从底层 BLE 堆栈下载完整的日志,它会告诉您出了什么问题。他们甚至会告诉您是否以某种方式滥用了 API。希望有帮助。

于 2017-03-15T11:44:57.060 回答