iOS藍(lán)牙常駐后臺(tái)-那些你可能遇到的坑

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"]) {
        ...
    }
    ...
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容