我正在尝试构建一个使用CoreBluetooth的命令行应用程序。问题是,它在命令行应用程序上不起作用。
我已将我的CoreBluetooth代码(实现CBCentralManagerDelegate协议的类- 称为此类myBLEManager)从命令行应用程序项目移至另一个Mac OS GUI应用程序。
CoreBluetooth
myBLEManager
我在ViewDidLoad()--supersample中运行了一些测试,我只是初始化了一个myBLEManager创建CBCentralManageron 实例的实例,然后调用scanForPeripherals。
ViewDidLoad()
CBCentralManager
scanForPeripherals
这是我在CLI和GUI项目中所做的事情。centralManagerDidUpdateState从未在CLI项目中调用差异。但它在GUI Mac应用程序中可以。
centralManagerDidUpdateState
大多数Apple框架中的回调都是通过应用程序的主运行循环传递的。如果您的命令行工具没有运行循环,则它将无法接收以这种方式发送的回调。
如果没有runloop,则框架调用回调的唯一方法是在另一个线程上运行它,这可能会导致意外的应用程序异常行为。
添加以下内容就足够了:
let runLoop = RunLoop.current let distantFuture = Date.distantFuture while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture) { }