이렇게하려면 doRangeBeacons 메서드가 호출 될 때마다 NSDictionary의 CLBeacon 개체를 유지하고 동기화해야합니다.
didRangeBeacons 메서드가 호출 될 때마다 이전에 반환 된 CLBeacons와는 다른 새 CLBeacon 개체 집합이 생성되어 반환된다는 것을 알아야합니다. 이를 처리하기 위해 동일한 실제 iBeacon을 나타내는 CLBeacon의 여러 인스턴스를 식별하고 비교하는 데 사용할 수있는 고유 한 ID를 사용하여 NSMutableDictionary에 CLBeacons를 저장하는 것이 좋습니다. 이 방법을 사용하면 NSDictionary에서 CLBeacons를 쉽게 추가/제거하고 최신 상태로 유지할 수 있으며 각 시간마다 중복이 없도록 didRangeBeacons가 호출됩니다. 여기
그것을 수행하는 방법입니다 :
첫째로 CLBeacon 각각의 새로운 객체를 병합하여 didRangeBeacons 방법을 수정하여 CLLocationManager의 대표
@property (nonatomic, strong) NSMutableDictionary *beaconsByUniqueID;
다음에 사전을 만들
- (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을 리턴 할 수 있습니다. 각 iBeacon에 대해 고유 한 값을 생성하려면 UUID, 주 및 부 값을 하나의 문자열로 결합하는 것이 좋습니다.
- (NSString *)uniqueIDForBeacon:(CLBeacon *)beacon {
return [NSString stringWithFormat:@"%@%@%@", [beacon.proximityUUID UUIDString], beacon.major, beacon.minor];
}
단일 콜백으로 모든 iBeacons을 반환하기를 원한다고 말했습니까? 위의 코드를 구현하는 사용자 지정 MYiBeaconManager 개체를 간단히 만들고 didRangeBeacons 끝 부분에서 대리인에 대한 사용자 지정 호출을 호출하여 대리자에게 iBeacon 집합이 업데이트되었음을 알릴 수 있습니다.
내가 알고있는 유일한 방법은 동일한 proximityUUID를 사용하여 단일 영역으로 결합하는 것입니다. 'didRangeBeacons : inRegion'은 그것이 말한 것을 수행하고 주어진 지역에 대해 어떤 비컨을 배치했는지 알려줍니다 *. 그렇지 않으면 기본적으로 모든 업데이트가 모든 지역에서 제공 될 때까지 대기하고 한 번에 함께 반환하는 자체 구현을 작성할 수 있습니다. – Mike