【问题标题】:10.9 CoreBluetooth RetrivePeriperals10.9 CoreBluetooth RetrivePeriperals
【发布时间】: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


    【解决方案1】:

    虽然这显然是一个非常古老的线程,但我今天偶然发现了同样的问题,并决定为后代发布一个修复程序。

    我试图根据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]];
        }
    }
    

    【讨论】:

    • 应该已经更新了,看起来 10.9.3 修复了我看到的问题,并且新方法如上所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2017-09-20
    • 2023-03-10
    • 2014-03-14
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多