10.9 CoreBluetooth RetrivePeriperals

时间:2013-12-03 14:27:36

标签: objective-c macos bluetooth core-bluetooth

我正在开发一个使用CoreBluetooth的OSX上的应用程序。我在OSX小牛队遇到了一个我似乎无法绕过的问题。 (所有这些在OSX 10.8上完美运行。)

首先让我们看一下应用程序的流程

enter image description here

这个流程已经相当成熟,已经在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上执行某种关闭序列,以防止人为失败?

任何建议都会非常感激!

1 个答案:

答案 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]];
    }
}