我正在尝试将iOS ibeacons与多个地区放在一起,效果很好。
但我的问题是,如果我对多个地区region1
和region2
进行了定位,我会分别收到两个范围事件调用didRangeBeacons:inRegion
。 (所以,如果我在tableview中显示信标列表,它会闪烁。)
我希望将范围内具有不同标识符的所有区域接收到单个didRangeBeacons:inRegion
回调(不是一个区域的一个回调。范围内所有区域的一个回调)。我看到可以通过设置estBeaconManager.returnAllRangedBeaconsAtOnce = YES;
来完成Estimote的SDK。
我想实现像estimote sdk对iOS CoreLocation
这样的类似解决方案。是否有任何解决方案或示例代码?
答案 0 :(得分:0)
您只需将两个可见信标数组合并到一个列表中即可。您可以通过在NSMutableDictionary
的{{1}}方法中分配整体AppDelegate
,然后在测距回调方法中将信标添加到此字典(由UUID / major / minor键控)来执行此操作。
棘手的部分是当它们不再可见时从组合列表中删除信标。最简单的方法是保持第二个onCreate
也被UUID / major / minor键入,并存储上次查看时间的NSMutableDictionary
时间戳。当信标上次看到的时间戳过去超过五秒时,请从每个NSDate
中删除信标的委托。
答案 1 :(得分:0)
为此,您需要保留一个CLBeacon对象的NSDictionary,并在每次调用didRangeBeacons方法时保持同步。
重要的是要了解每次调用didRangeBeacons方法时,生成并返回一组新的CLBeacon对象,这些对象不是==先前返回的CLBeacons。为了解决这个问题,我建议将您的CLBeacons存储在NSMutableDictionary中,该NSMutableDictionary具有唯一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方法可以返回任何对iBeacon唯一的NSString。我建议简单地将UUID,major和minor值组合成一个字符串,为每个iBeacon创建一个唯一值。
- (NSString *)uniqueIDForBeacon:(CLBeacon *)beacon {
return [NSString stringWithFormat:@"%@%@%@", [beacon.proximityUUID UUIDString], beacon.major, beacon.minor];
}
你说你想要一个回调来返回所有的iBeacons。您可以简单地创建一个实现上述代码的自定义MYiBeaconManager对象,并在didRangeBeacons末尾调用对其委托的自定义调用,以告知委托iBeacon集已更新。