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

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

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

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

最佳答案

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

如果没有 runloop,框架调用回调的唯一方法就是在另一个线程上运行它,这可能会导致应用程序出现意想不到的奇怪行为。

添加以下内容就足够了:

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

}

关于swift - Mac 上的 CoreBluetooth 命令行应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42634584/

10-11 22:27
查看更多