出現(xiàn)問題的部分邏輯非常的簡(jiǎn)單,我們的藍(lán)牙產(chǎn)品在廣播包中會(huì)以某個(gè)字節(jié)標(biāo)識(shí)自己的類型,掃描到設(shè)備以后代理方法中會(huì)以字典的形式提供給我們。
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI
{
id data = advertisementData[@"kCBAdvDataManufacturerData"];
}
要解決問題之前必須要聲明一點(diǎn),在藍(lán)牙的標(biāo)準(zhǔn)協(xié)議當(dāng)中,設(shè)備的發(fā)現(xiàn)流程如下。

發(fā)現(xiàn)流程
按照協(xié)議,第15個(gè)字節(jié)就是設(shè)備的類型。但是提供給客戶之后,發(fā)現(xiàn)在iOS 8上設(shè)備類型獲取錯(cuò)誤,iOS 9及以后版本沒有問題。出現(xiàn)這個(gè)情況的原因在于,iOS 8及以前kCBAdvDataManufacturerData這個(gè)數(shù)據(jù)提供的是scan response (SCAN_RSP),但是iOS 9及以后會(huì)把advertising packet (ADV_IND)和scan response (SCAN_RSP)兩部分合并在一起提供給了我們。所以不同版本的情況下我們獲取kCBAdvDataManufacturerData會(huì)出現(xiàn)不同。