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