出现问题的部分逻辑非常的简单,我们的蓝牙产品在广播包中会以某个字节标识自己的类型,扫描到设备以后代理方法中会以字典的形式提供给我们。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI
{
id data = advertisementData[@"kCBAdvDataManufacturerData"];
}
要解决问题之前必须要声明一点,在蓝牙的标准协议当中,设备的发现流程如下。
按照协议,第15个字节就是设备的类型。但是提供给客户之后,发现在iOS 8上设备类型获取错误,iOS 9及以后版本没有问题。出现这个情况的原因在于,iOS 8及以前kCBAdvDataManufacturerData
这个数据提供的是scan response (SCAN_RSP),但是iOS 9及以后会把advertising packet (ADV_IND)和scan response (SCAN_RSP)两部分合并在一起提供给了我们。所以不同版本的情况下我们获取kCBAdvDataManufacturerData
会出现不同。