9

好吧,我有一个应用程序可以扫描并连接到 ios 6.0.1 下但在 iphone 4s 上的“蓝牙 le”设备,它运行良好。将应用程序上传到苹果商店时,他们返回给我一个应用程序崩溃,bat 编程,但我只了解当我在 iphone5 上尝试应用程序时崩溃

 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; 

给我一个带有空 uuid 的外围设备。

我打印外围设备、名称、uuid、rssi 和 advertData,一切都很好,但 uuid 为空,我在应用程序中使用 uuid。这使我的应用程序崩溃,我可以控制 null uuid,这意味着我无法控制应用程序。

有人知道会发生什么,以及可能的解决方案吗?

4

3 回答 3

2

接下来我们要做的是:你不能用 NSLog 写外设对象,但是在执行 connect 之前我们不能有外设的 uuid 属性。它始终为空。我们在服务读取完成时请求 uuid,而不是之前,然后我们无法在 i-phone5 上运行应用程序而不会崩溃。

我在 TI(德克萨斯仪器)上读到它是一个 ios 错误,但我认为这是一个 ble 安全更新,我们需要在询问 uuid 之前进行连接。

于 2012-12-10T11:17:41.790 回答
1

第一次连接后,设备会记住/缓存 UUID。如果稍后发现相同的外围设备,则 UUID 将在连接之前可用。您可以通过调用“retrievePeripherals”来请求所有记住的外围设备。

于 2012-12-19T22:36:49.723 回答
0

它似乎是 iOS 6 中的一个错误/功能增强,我认为由于代码的异步性质,它在 iPhone 5 上更加明显。我也有适用于 4S 但不适用于 5 的代码。

大多数人发布的解决方法是确保您在找到时连接到您找到的每台设备。解释是在建立连接之前不会分配 UUID。

您可以在 TI 传感器标签代码中看到一个示例,您可以从 TI 网站下载该代码

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

    NSLog(@"Found a BLE Device : %@",peripheral);

    /* iOS 6.0 bug workaround : connect to device before displaying UUID !
       The reason for this is that the CFUUID .UUID property of CBPeripheral
       here is null the first time an unkown (never connected before in any app)
       peripheral is connected. So therefore we connect to all peripherals we find.
    */

    peripheral.delegate = self;
    [central connectPeripheral:peripheral options:nil];

    [self.nDevices addObject:peripheral];

}

但是值得注意的是,您还可以执行以下操作

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"didDiscoverPeripheral");

    if (![foundPeripherals containsObject:peripheral]) {
        NSLog(@"foundPeripherals addObject %@", peripheral.name);
        [foundPeripherals addObject:peripheral];
    } else {
        NSInteger index = [foundPeripherals indexOfObject:peripheral];
        NSLog(@"foundPeripherals replaceObject %@", peripheral.name);
        [foundPeripherals replaceObjectAtIndex:index withObject:peripheral];
    }

}

asdidDiscoverPeripheral为每个设备调用不止一次(我在 iPhone 5 上看到它调用了两次),第二次外围设备详细信息完成。

于 2013-06-03T09:59:41.240 回答