我试图用范围内多个地区的iOS ibeacons和它工作得很好。
但我的问题是,如果我范围内的多个地区region1
和region2
,我收到两个测距事件调用, didRangeBeacons:inRegion
分开。 (所以,如果我表现出的tableview信标列表,它会闪烁。)
我想接收的不同标识符的所有区域中的范围为单didRangeBeacons:inRegion
回调(一个回调一个区域在范围内的一个回调所有区域不是)。 只见它可以与Estimote的SDK通过设置来完成estBeaconManager.returnAllRangedBeaconsAtOnce = YES;
。
我要像estimote SDK与iOS那样实行类似的解决方案CoreLocation
。 对此有任何解决方案或示例代码?
你只需要看到的信标的两个数组合并成一个列表。 您可以通过分配的总体做到这一点NSMutableDictionary
在你AppDelegate
的onCreate
方法,然后标添加到这个字典(由UUID键/主要/次要)在测距回调方法。
当他们不再可见棘手的部分是去除合并清单的信标。 要做到这一点,最简单的方法是保持第二NSMutableDictionary
也由UUID /主/次键,和存储NSDate
,当它最后一次出现的时间戳记。 当信的最后一次露面时间戳在过去超过五秒,请从每个信标的委托NSMutableDictionary
。
要做到这一点,你需要保持CLBeacon对象的一个NSDictionary,并保持每个didRangeBeacons方法被调用的时间同步。
据了解,你们每个didRangeBeacons方法被调用时,对象生成一组新的CLBeacon,并返回未==到之前返回CLBeacons是很重要的。 为了解决这个问题,我会建议存储一个NSMutableDictionary您CLBeacons有一个唯一的ID可以用来鉴别和比较代表相同的实际iBeacon显示CLBeacon的多个实例。 这样,您就可以轻松地添加/从NSDictionary中删除CLBeacons并保持最新状态,并且没有重复,每次之后didRangeBeacons被调用。
这里是如何做到这一点:
首先创建一个在您CLLocationManager的委托词典
@property (nonatomic, strong) NSMutableDictionary *beaconsByUniqueID;
下一步修改didRangeBeacons方法各组新CLBeacon对象合并成
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
if(!self.beaconsByUniqueID) {
self.beaconsByUniqueID = [[NSMutableDictionary alloc] init]; // This could also be done in your init
}
// Remove all CLBeacon objects for the CLBeaconRegion being returned
NSMutableArray *uniqueIDsToRemove = [[NSMutableArray alloc] initWithCapacity:[self.beaconsByUniqueID count]];
for(NSString *beaconUniqueID in self.beaconsByUniqueID) {
CLBeacon *beacon = [self.beaconsByUniqueID objectForKey:beaconUniqueID];
if([beacon.proximityUUID isEqual:region.proximityUUID]) { // Only remove Beacons in the currently returned region
[uniqueIDsToRemove addObject:beaconUniqueID];
}
}
[self.beaconsByUniqueID removeObjectsForKeys:uniqueIDsToRemove];
// Add in the new beacon objects
for(CLBeacon *beacon in beacons) {
[self.beaconsByUniqueID setObject:beacon forKey:[self uniqueIDForBeacon:beacon]];
}
// beaconsByUniqueID now contains the most recent set of iBeacons with no duplicates
// Reload your tableView here
// or call a custom callback with beaconsByUniqueID
}
您uniqueIDForBeacon方法可以返回任何的NSString,这将是唯一的iBeacon显示。 我会建议简单地组合的UUID,主要和次要值成一个字符串来为每个iBeacon显示了独特的价值。
- (NSString *)uniqueIDForBeacon:(CLBeacon *)beacon {
return [NSString stringWithFormat:@"%@%@%@", [beacon.proximityUUID UUIDString], beacon.major, beacon.minor];
}
你说,你要一个回调做返回所有iBeacons。 你可以简单地创建一个实现上面的代码,并呼吁在didRangeBeacons结束自定义调用其委托以告诉iBeacon显示设置进行了更新委托定制MYiBeaconManager对象。
文章来源: How to received ibeacons different regions ranging event in single didRangeBeacons:inRegion callback.