如何在单个didRangeBeacons:inRegion回调中接收ibeacons不同区域范围事件。

时间:2014-09-28 06:59:41

标签: ios core-location ibeacon estimote

我正在尝试将iOS ibeacons与多个地区放在一起,效果很好。

但我的问题是,如果我对多个地区region1region2进行了定位,我会分别收到两个范围事件调用didRangeBeacons:inRegion。 (所以,如果我在tableview中显示信标列表,它会闪烁。)

我希望将范围内具有不同标识符的所有区域接收到单个didRangeBeacons:inRegion回调(不是一个区域的一个回调。范围内所有区域的一个回调)。我看到可以通过设置estBeaconManager.returnAllRangedBeaconsAtOnce = YES;来完成Estimote的SDK。

我想实现像estimote sdk对iOS CoreLocation这样的类似解决方案。是否有任何解决方案或示例代码?

2 个答案:

答案 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集已更新。