如何在单个didRangeBeacons:inRegioncallback中收到ibeacons不同区域的事件。

我正在尝试将iOS ibeacons与多个区域进行比较,效果很好。

但我的问题是,如果我范围多个区域region1region2 ,我收到了两个测距事件调用, didRangeBeacons:inRegion分开。 (所以,如果我在tableview中显示信标列表,它正在闪烁。)

我想收到范围内具有不同的标识符的所有区域单个didRangeBeacons:inRegioncallback(一个区域没有一个callback,范围内的所有区域callback一个)。 我看到它可以通过设置estBeaconManager.returnAllRangedBeaconsAtOnce = YES;来使用Estimote的SDK完成estBeaconManager.returnAllRangedBeaconsAtOnce = YES;

我想实现像iOS CoreLocation一样的estimote sdk类似的解决scheme。 有没有解决scheme或示例代码?

您只需将两个可见信标arrays组合成一个列表即可。 你可以通过在你的AppDelegateonCreate方法中分配一个整体的NSMutableDictionary ,然后在范围callback方法中将信标添加到这个字典中(用UUID / major / minor键入)。

棘手的部分是从组合列表中删除信标,当它们不再可见时。 最简单的方法是保留第二个NSMutableDictionary也由UUID / major / minor键入),并存储NSDate时间戳记的最后一次显示时间。 当信标最后一次看到的时间戳超过5秒钟时,从每个NSMutableDictionary移除信标的委托。

要做到这一点,你将需要保持一个CLBeacon对象的NSDictionary,并保持每次调用didRangeBeacons方法同步。

每次调用didRangeBeacons方法时,都要了解每一次您都会生成一组新的CLBeacon对象,并将这些对象返回给以前返回的CLBeacons。 为了解决这个问题,我build议将你的CLBeacons存储在一个NSMutableDictionary中,并且使用一个唯一的ID来标识和比较多个表示相同实际iBeacon的CLBeacon实例。 这样,您可以轻松地从NSDictionary添加/删除CLBeacons,并保持最新状态,并在每次调用didRangeBeacons之后不重复。

这里是如何做到这一点:

首先在CLLocationManager的委托中创build字典

 @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。 我build议只需将UUID,主要和次要值组合成一个string,为每个iBeacon创build一个唯一的值。

 - (NSString *)uniqueIDForBeacon:(CLBeacon *)beacon { return [NSString stringWithFormat:@"%@%@%@", [beacon.proximityUUID UUIDString], beacon.major, beacon.minor]; } 

你说你想要一个callback来做所有的iBeacons。 您可以简单地创build一个实现上述代码的自定义MYiBeaconManager对象,并在didRangeBeacons结束时调用对其委托的自定义调用,以通知委托人iBeacon集已更新。

Interesting Posts