Mac 上的 CoreBluetooth 命令行应用程序
Posted
技术标签:
【中文标题】Mac 上的 CoreBluetooth 命令行应用程序【英文标题】:CoreBluetooth on Mac Command line application 【发布时间】:2017-03-06 20:05:17 【问题描述】:我正在尝试构建一个使用 CoreBluetooth 的命令行应用程序。问题是,它不适用于命令行应用程序。
我已将我的 CoreBluetooth
代码(一个实现 CBCentralManagerDelegate 协议的类 - 我们将此类称为 myBLEManager
)从命令行应用程序项目移至另一个 Mac OS GUI 应用程序。
我在ViewDidLoad()
中运行了一些测试——超级样本,我只是初始化了一个myBLEManager
,它在初始化时创建了一个CBCentralManager
的实例,然后调用scanForPeripherals
。
这是我在 CLI 和 GUI 项目中所做的。区别在于 centralManagerDidUpdateState
永远不会在 CLI 项目中被调用。但它在 GUI Mac 应用程序中确实如此。
【问题讨论】:
你的命令行工具有运行循环吗? @duskwuff,我没有。谢谢指点,我去看看 您要发布答案吗?或者我应该什么时候完成?由你决定 发布了答案。 :) @kmn 您能否更新答案以显示您的主类和 myBLEManager 类的更详细示例? 【参考方案1】:大多数 Apple 框架中的回调是通过应用程序的主运行循环传递的。如果您的命令行工具没有运行循环,则它无法接收以这种方式发送的回调。
如果没有 runloop,框架调用回调的唯一方法是在另一个线程上运行它,这可能会导致应用程序出现意想不到的奇怪行为。
添加即可:
let runLoop = RunLoop.current
let distantFuture = Date.distantFuture
while running == true && runLoop.run(mode: RunLoopMode.defaultRunLoopMode, before: distantFuture)
【讨论】:
您能否更新答案以显示您的主类和 myBLEManager 类的更详细示例? @angryip 我没有写程序。 很公平,我会联系作者 这是我发现的一个示例,它使用 RunLoop 从命令行应用程序访问 CoreLocation:gist.github.com/cmittendorf/2c6eefc6dd128b323428以上是关于Mac 上的 CoreBluetooth 命令行应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在 OSX 上模拟 HID:IOBluetooth 还是 CoreBluetooth?
CoreBluetooth 框架可以用来连接非 Apple 设备吗?