我正在开发一个使用CoreBluetooth的OSX上的应用程序。我在OSX小牛队遇到了一个我似乎无法绕过的问题。 (所有这些在OSX 10.8上完美运行。)
首先让我们看一下应用程序的流程
这个流程已经相当成熟,已经在iOS应用程序中成功使用,并在10.8上运行。所以在小牛队,第一轮比赛成功完成。它可以正确扫描,查找和连接设备。它还将设备的UUID与其他属性一起保存到.plist文件中。
重新启动应用程序后,它会尝试沿着流的左侧列向下移动,这是问题似乎发生的地方。
所以我注意到的第一个问题是,我对self.central retrievePeripherals:
的调用从未调用-(void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals
的代理回调。它永远不会得到小牛队的回调。
我的下一个想法是“哦,他们有一个新的API用于在Mavericks上获取外围设备而旧版本已被弃用,让我们尝试一下”。所以我在调用NSArray *identifiers = [self.central retrievePeripheralsWithIdentifiers:@[uuid]];
的时候加入了我的陷阱,我陷入了一个愚蠢的等待陷阱。经过仔细调试后发现,有时我的CBCentralManager进入CBCentralManagerStateUnknown状态,并且永远不会将状态更新为更新的状态。
我接下来要做的就是启动Activity Monitor并杀死蓝色进程。最后,使用正确的CBCentralManagerStatePoweredOn调用-(void)centralManagerDidUpdateState:(CBCentralManager *)central
的委托回调,因此我再次执行retrievePeripheralsWithIdentifiers
并收到一个空数组。
因此,所有这些问题似乎都与某种方式的蓝色联系在一起。有没有人更深入地了解这个过程,以避免发生了什么?
我的主要问题是。为什么这是第一次通过应用程序而不是第二次?在初始扫描和连接后退出应用程序时,似乎我不能再使用系统蓝牙进行任何操作而不重置蓝色(即使这样也不会检索外围设备)。我是否需要在CBCentralManager上执行某种关闭序列,以防止人为失败?
任何建议都会非常感激!
答案 0 :(得分:3)
虽然这显然是一个非常古老的主题,但我今天偶然发现了同样的问题,并决定为后代发布修正案。
我试图根据HeartRateMonitor example provided by Apple破解一个简单的应用程序。不幸的是,如果将autoConnect设置为TRUE,它在10.9上不起作用,更糟糕的是,它会降低蓝色。
在10.9中,对(已弃用的)retrievePeripherals
冻结的调用在没有恢复机会的情况下变蓝。 CBCentralManager进入CBCentralManagerStateUnknown,蓝牙无法使用操作系统功能等打开/关闭。我找到的唯一解决方案是killall -9 blued
。
然而,同步retrievePeripheralsWithIdentifiers对我来说效果很好(10.9.4)。以下是修改后的HeartRateMonitor代码的相关摘录:
/* Retreive already known devices */
if(autoConnect)
{
NSArray *peripherals = [manager retrievePeripheralsWithIdentifiers:[NSArray arrayWithObject:(id)aPeripheral.identifier]];
NSLog(@"Retrieved peripheral: %lu - %@", [peripherals count], peripherals);
[self stopScan];
/* If there are any known devices, automatically connect to it.*/
if([peripherals count] >=1)
{
[indicatorButton setHidden:FALSE];
[progressIndicator setHidden:FALSE];
[progressIndicator startAnimation:self];
peripheral = [peripherals objectAtIndex:0];
[peripheral retain];
[connectButton setTitle:@"Cancel"];
[manager connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}
}