Mac 命令行应用程序上的 CoreBluetooth

CoreBluetooth on Mac Command line application

我正在尝试构建一个使用 CoreBluetooth 的命令行应用程序。问题是,它不适用于命令行应用程序。

我已经从命令行应用程序项目中移动了我的 CoreBluetooth 代码(实现 CBCentralManagerDelegate 协议的 class - 我们称之为 class myBLEManager)到另一个 Mac OS GUI 应用程序。

我 运行 在 ViewDidLoad() 中进行了一些测试 -- 超级样本,我只是初始化了一个 myBLEManager,它在初始化时创建了一个 CBCentralManager 的实例,然后调用 scanForPeripherals.

这就是我在 CLI 和 GUI 项目中所做的。不同之处在于 centralManagerDidUpdateState 永远不会在 CLI 项目中被调用。但在 GUI Mac 应用程序中确实如此。

大多数 Apple 框架中的回调都是通过应用程序的主 运行 循环传递的。如果您的命令行工具没有 运行 循环,它无法接收以这种方式发送的回调。

如果没有 运行 循环,框架调用回调的唯一方法是 运行 在另一个线程上调用它,这可能会导致应用程序出现奇怪的行为,而没有期待。

加上就够了:

let runLoop = RunLoop.current
let distantFuture = Date.distantFuture
while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture) {

}