APP進(jìn)入后臺(tái)后,藍(lán)牙掃描必須指明servicesId
NSArray *servicesArray = @[[CBUUID UUIDWithString:D_Transfer_Service_UUID]];
[self.centralManager scanForPeripheralsWithServices:servicesArray
options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @(YES)}];
- 當(dāng)APP處于前臺(tái)時(shí),如果第一個(gè)參數(shù)設(shè)置成nil念秧,那么centralManager會(huì)返回所有被發(fā)現(xiàn)的外設(shè),否則布疼,只有有廣播這些uuid服務(wù)的外設(shè)才會(huì)被返回摊趾;
- 當(dāng)APP處于后臺(tái)時(shí),如果第一個(gè)參數(shù)為nil游两,那么centralManager不會(huì)返回任何外設(shè)砾层,因此如果你希望你的APP支持藍(lán)牙后臺(tái)運(yùn)行,那么你需要設(shè)置明確的servicesId
APP進(jìn)入后臺(tái)后贱案,只能掃描到廣播包掃不到掃描包
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
- 外設(shè)進(jìn)行廣播時(shí)肛炮,廣播內(nèi)容包括廣播包和掃描包
- 當(dāng)APP處于前臺(tái)時(shí),藍(lán)牙可以掃到外設(shè)廣播的全部?jī)?nèi)容宝踪,即:advertisementData實(shí)際上整合了外設(shè)廣播的廣播包和掃描包
- 當(dāng)APP處于后臺(tái)時(shí)侨糟,藍(lán)牙只能掃到外設(shè)廣播的廣播包,掃不到掃描包瘩燥,即:advertisementData只包含廣播包內(nèi)容秕重,所以如果你的APP需要支持后臺(tái)運(yùn)行,那么你需要告知嵌入式工程師把廣播內(nèi)容全部放到廣播包中
外設(shè)名稱更改后厉膀,掃描到的仍然是舊的名稱
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
假設(shè)外設(shè)初始名稱為WatchName-A悲幅,你用WatchName-A進(jìn)行了掃描連接,然后嵌入式工程師把外設(shè)名稱更改為WatchName-B站蝠,你再次掃描時(shí)會(huì)發(fā)現(xiàn)你掃描到的設(shè)備名仍然是WatchName-A汰具,這時(shí)無(wú)論你重啟手機(jī)藍(lán)牙還是重啟手機(jī)都會(huì)發(fā)現(xiàn)設(shè)備名依然是WatchName-A,因此如果你在發(fā)現(xiàn)設(shè)備后通過(guò)[peripheral.name isEqualToString:@"WatchName-B"]
來(lái)確定你的設(shè)備菱魔,你將會(huì)錯(cuò)誤的認(rèn)為外設(shè)壞了沒(méi)有進(jìn)行廣播留荔,因此更安全的方法是你通過(guò)廣播包中的名稱來(lái)確定你的設(shè)備名,即:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
NSData *manufacturerData = [advertisementData objectForKey:CBAdvertisementDataManufacturerDataKey];
NSString *name = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
if ([name isEqualToString:@"WatchName-B"] || [peripheral.name isEqualToString:@"WatchName-B"]) {
...
}
...
}