ios基础BUG疑难杂症

iOS蓝牙常驻后台-那些你可能遇到的坑

2018-05-18  本文已影响173人  julieQY7

APP进入后台后,蓝牙扫描必须指明servicesId

    NSArray *servicesArray = @[[CBUUID UUIDWithString:D_Transfer_Service_UUID]];
    [self.centralManager scanForPeripheralsWithServices:servicesArray
                                                options:@{CBCentralManagerScanOptionAllowDuplicatesKey : @(YES)}];

APP进入后台后,只能扫描到广播包扫不到扫描包

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI

外设名称更改后,扫描到的仍然是旧的名称

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI

假设外设初始名称为WatchName-A,你用WatchName-A进行了扫描连接,然后嵌入式工程师把外设名称更改为WatchName-B,你再次扫描时会发现你扫描到的设备名仍然是WatchName-A,这时无论你重启手机蓝牙还是重启手机都会发现设备名依然是WatchName-A,因此如果你在发现设备后通过[peripheral.name isEqualToString:@"WatchName-B"]来确定你的设备,你将会错误的认为外设坏了没有进行广播,因此更安全的方法是你通过广播包中的名称来确定你的设备名,即:

- (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"]) {
        ...
    }
    ...
}
上一篇 下一篇

猜你喜欢

热点阅读