Corebluetooth central manager callback didDiscoverPeripheral twice

后端 未结 2 1966
醉梦人生
醉梦人生 2020-12-09 20:26

I scan for my peripheral like this:

NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] 
                                     


        
相关标签:
2条回答
  • 2020-12-09 20:55

    Devices may return additional data while advertising. These may arrive in separate packets, arriving at different times. In this case, didDiscoverPeripheral is called first when the device is initially seen, and then again when additional information becomes available for it.

    CBCentralManagerScanOptionAllowDuplicatesKey is different. It tells CoreBluetooth whether you want to receive duplicate results when the device advertises itself again. It doesn't prevent multiple calls to didDiscoverPeripheral for the same discovery sequence; it prevents it for repeated discovery sequences.

    Source: http://lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html (the Apple rep on bluetooth-dev).

    0 讨论(0)
  • 2020-12-09 21:00

    I don't think this parameter does what you think it does. My understanding from looking at how it is used in Apple samples like the Health Thermometer is that turning this flag on allows discovery of multiple different peripherals with the same UUID. For example, if you want to write an app that looks at four different thermometers in the same room, and finds all of them, you would need the parameter so the scan didn't stop after finding the first one.

    In their code, Apple avoids duplicates like this:

    NSMutableArray *peripherals = [self mutableArrayValueForKey:@"thermometers"];
    if( ![self.thermometers containsObject:peripheral] )
        [peripherals addObject:peripheral];
    

    If the device already exists in the array, it is not added a second time.

    It would be nice if the documentation was clearer on this point. I admit I'm guessing based on how the parameter is used in context.

    0 讨论(0)
提交回复
热议问题