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) {
}
我正在尝试构建一个使用 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) {
}