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 命令行应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Mac App 中的 CoreBluetooth 权利

CoreBluetooth - 未为服务设置 UUID

在 OSX 上模拟 HID:IOBluetooth 还是 CoreBluetooth?

CoreBluetooth 框架可以用来连接非 Apple 设备吗?

iPhone 5C/5S 上的 CoreBluetooth:收到的数据损坏

iPhone 4S 上的 Corebluetooth 故障?