2014-09-28 3 views
1

여러 지역에서 iOS ibeacons의 범위를 지정하려고하는데 잘 작동합니다.단일 didRangeBeacons : 이벤트 콜백에서 이벤트 범위가 다른 지역을받는 방법.

그러나 내 문제는 범위가 여러 지역 region1region2 인 경우 두 가지 범위 지정 이벤트 호출 didRangeBeacons:inRegion을 받았습니다. (따라서 테이블 뷰에 비컨리스트를 표시하면 깜박입니다.) didRangeBeacons:inRegion 콜백 (하나의 지역에 대해 하나의 콜백이 아닌, 모든 지역에 대해 하나의 콜백으로 범위 내의 다른 식별자를 가진 모든 지역을 수신하고 싶습니다. 범위). 나는 Estimote의 SDK로 estBeaconManager.returnAllRangedBeaconsAtOnce = YES;을 설정함으로써이 작업이 가능하다는 것을 알았다.

iOS CoreLocation을 사용하여 추정 된 SDDk와 비슷한 솔루션을 구현하고 싶습니다. 이에 대한 솔루션이나 샘플 코드가 있습니까?

+0

내가 알고있는 유일한 방법은 동일한 proximityUUID를 사용하여 단일 영역으로 결합하는 것입니다. 'didRangeBeacons : inRegion'은 그것이 말한 것을 수행하고 주어진 지역에 대해 어떤 비컨을 배치했는지 알려줍니다 *. 그렇지 않으면 기본적으로 모든 업데이트가 모든 지역에서 제공 될 때까지 대기하고 한 번에 함께 반환하는 자체 구현을 작성할 수 있습니다. – Mike

답변

0

표시되는 비컨의 두 배열을 단일 목록으로 결합하기 만하면됩니다. AppDelegateonCreate 메소드에 전체 NSMutableDictionary을 할당 한 다음 레인 징 콜백 메소드에서이 사전에 비컨을 추가합니다 (UUID/major/minor가 입력 됨).

까다로운 부분은 더 이상 보이지 않는 결합 된 목록에서 비컨을 제거하는 것입니다. 이를 수행하는 가장 쉬운 방법은 UDID/major/minor가 보조 된 NSMutableDictionary을 유지하고 마지막으로 본 시간의 NSDate 타임 스탬프를 저장하는 것입니다. 비컨의 마지막으로 본 타임 스탬프가 과거 5 초보다 길면 각 NSMutableDictionary에서 비컨의 위탁을 제거합니다.

0

이렇게하려면 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 집합이 업데이트되었음을 ​​알릴 수 있습니다.