【发布时间】:2013-12-19 16:00:54
【问题描述】:
我正在 OSX 上开发一个使用 CoreBluetooth 的应用程序。我在 OSX Mavericks 上遇到了一个我似乎无法解决的问题。 (所有这些都可以在 OSX 10.8 上完美运行)。
首先让我们来看看应用程序的流程
此流程已相当成熟,已在 iOS 应用程序中成功使用并在 10.8 上运行。所以在小牛队,第一次运行成功完成。它会扫描、查找并正确连接到设备。它还将设备的 UUID 与其他属性一起保存到 .plist 文件中。
在重新启动应用程序时,它会尝试沿着流程的左侧列向下移动,这似乎是出现问题的地方。
所以我注意到的第一个问题是我对self.central retrievePeripherals: 的调用从未调用我对-(void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals
的委托回调。它根本就不会在 Mavericks 上得到回调。
我的下一个想法是“哦,他们有一个用于在 Mavericks 上获取外围设备的新 API,而旧的 API 已被弃用,让我们试试吧”。所以我在我的电话中添加了NSArray *identifiers = [self.central retrievePeripheralsWithIdentifiers:@[uuid]];,我陷入了一个信号等待陷阱。经过仔细调试后发现,有时我的 CBCentralManager 会进入 CBCentralManagerStateUnknown 状态,并且永远不会将状态更新为较新的状态。
接下来我尝试启动 Activity Monitor 并终止 blued 进程。最后,-(void)centralManagerDidUpdateState:(CBCentralManager *)central 的委托回调被正确的 CBCentralManagerStatePoweredOn 调用,所以我再次执行 retrievePeripheralsWithIdentifiers 并收到一个空数组。
所以所有这些问题似乎都以某种方式与 blued 有关。有没有人对这个过程有更深入的了解来逃避发生了什么?
我的主要问题是。为什么这在第一次通过应用程序时有效,但第二次无效?在初始扫描和连接后退出应用程序后,我似乎无法再使用系统蓝牙进行任何操作而不重置 blued(即使这样也不会检索外围设备)。我需要在 CBCentralManager 上执行某种关闭顺序以防止蓝蓝走失吗?
任何建议都将不胜感激!
【问题讨论】:
标签: objective-c macos bluetooth core-bluetooth