-->

如何获得ibeacons不同区域的单didRangeBeacons范围事件:inRegion回调。(

2019-10-21 02:08发布

我试图用范围内多个地区的iOS ibeacons和它工作得很好。

但我的问题是,如果我范围内的多个地区region1region2 ,我收到两个测距事件调用, didRangeBeacons:inRegion分开。 (所以,如果我表现出的tableview信标列表,它会闪烁。)

我想接收的不同标识符的所有区域中的范围为单didRangeBeacons:inRegion回调(一个回调一个区域在范围内的一个回调所有区域不是)。 只见它可以与Estimote的SDK通过设置来完成estBeaconManager.returnAllRangedBeaconsAtOnce = YES;

我要像estimote SDK与iOS那样实行类似的解决方案CoreLocation 。 对此有任何解决方案或示例代码?

Answer 1:

你只需要看到的信标的两个数组合并成一个列表。 您可以通过分配的总体做到这一点NSMutableDictionary在你AppDelegateonCreate方法,然后标添加到这个字典(由UUID键/主要/次要)在测距回调方法。

当他们不再可见棘手的部分是去除合并清单的信标。 要做到这一点,最简单的方法是保持第二NSMutableDictionary也由UUID /主/次键,和存储NSDate ,当它最后一次出现的时间戳记。 当信的最后一次露面时间戳在过去超过五秒,请从每个信标的委托NSMutableDictionary



Answer 2:

要做到这一点,你需要保持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.