我正在开展一个项目,通过特定的UUID显示所有蓝牙LE设备的列表。在方法didDiscoverPeripheral
中,我保存了已发布的广告外围设备。扫描外围设备时,我使用选项dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO]
。我有一个NSTimer
每30秒唤醒一次,以更新已发现的外围设备列表,看看是否所有外围设备仍然是广告。我使用retrievePeripheralsWithIdentifiers
方法传递了NSUUID
已发现和保存的外围设备数组。该方法应返回仍为广告的CBPeripherals
数组。但是它返回了我作为参数传递的所有外围设备的原始数组,并且它永远不会排除不再做广告的外围设备。我不正确地使用这种方法吗?
savedPeripherals
是NSDictionary
,其中设备ID是密钥,CBPeripheral
是值。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:30
target:self
selector:@selector(updateActivePeripherals:)
userInfo:nil
repeats:YES];
- (void) updateActivePeripherals:(NSTimer *)timer
{
NSMutableArray *peripherals = [[NSMutableArray alloc]init];
if (self.savedPeripherals.count > 0)
{
for(id key in self.savedPeripherals)
{
CBPeripheral *item = [self.savedPeripherals objectForKey:key];
NSString *identifier=[NSString stringWithFormat:@"%@", [[item identifier] UUIDString]];
NSUUID *id=[[NSUUID alloc]initWithUUIDString:identifier];
if (id)
[peripherals addObject:id];
}
}
if (peripherals.count > 0)
{
NSArray *list =[_centralManager retrievePeripheralsWithIdentifiers:peripherals];
}
}
}
答案 0 :(得分:3)
documentation并未声明retrievePeripheralsWithIdentifiers
将返回仍然可见/广告的外围设备。相反,它说它返回:
中央管理员能够匹配的外围设备列表 提供标识符。
即使外围设备当前不可见,中央管理器也将返回已知的外围设备。这是为了允许应用程序在可见时自动连接到特定外围设备。工作流程如下:
CBPeripheral
retrievePeripheralsWithIdentifiers
connect
为了实现您需要的功能,您需要使用CBCentralManagerScanOptionAllowDuplicatesKey:YES
并针对每个外围设备保持年龄。例如,您可以使用以下方法:
30
的字典中,并在必要时将外围设备存储在表视图的源数组中