在我的iBeaconReceiver应用程序中,我试图监视超过1个区域,并且我使用了此代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Initialize location manager and set ourselves as the delegate and beacons dictionary
    _beacons = [[NSMutableDictionary alloc] init];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    self.myBeaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"6C1AA496-1653-403D-BD1E-7F630AA6F254"] major: 1 minor: 1 identifier: @"region1"];

    self.myBeaconRegion2 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"6C1AA496-1653-403D-BD1E-7F630AA6F254"] major: 1 minor: 2 identifier: @"region2"];

    NSLog(@"startMonitoring");
    // Tell location manager to start monitoring for the beacon region
    [self.locationManager startMonitoringForRegion:self.myBeaconRegion];
    [self.locationManager startMonitoringForRegion:self.myBeaconRegion2];

    _myBeaconRegion.notifyEntryStateOnDisplay = YES;
    _myBeaconRegion2.notifyEntryStateOnDisplay = YES;


    // Check if beacon monitoring is available for this device
    if (![CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]){
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Monitoring not available" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil]; [alert show]; return;
    }

}

然后我开始寻找信标
- (void)locationManager:(CLLocationManager*)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    if(state == CLRegionStateInside)
    {
        if([region.identifier isEqualToString:@"region1"])
            [self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion];
        else if ([region.identifier isEqualToString:@"region2"])
            [self.locationManager startRangingBeaconsInRegion:self.myBeaconRegion2];
    }
}

现在这是我的问题,我以这种方式创建了一个简单的UITableView,显示我设备范围内的信标
-(void)locationManager:(CLLocationManager*)manager
       didRangeBeacons:(NSArray*)beacons
              inRegion:(CLBeaconRegion*)region
{
    //NSLog(@"didRangeBeacons");
    [_beacons removeAllObjects];

    NSArray *immediateBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityImmediate]];
    if([immediateBeacons count])
        [_beacons setObject:immediateBeacons forKey:[NSNumber numberWithInt:CLProximityImmediate]];

    NSArray *nearBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityNear]];
    if([nearBeacons count])
        [_beacons setObject:nearBeacons forKey:[NSNumber numberWithInt:CLProximityNear]];

    NSArray *farBeacons = [beacons filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"proximity = %d", CLProximityFar]];
    if([farBeacons count])
        [_beacons setObject:farBeacons forKey:[NSNumber numberWithInt:CLProximityFar]];

    [self.tableView reloadData];

}

使用_beacons字典。
这是我的情况:

首先,我必须说我正在使用iPad作为iBeacon天线,能够交替广播region1region2
  • 开始广播region1,一切正常,我的UITableView充满了该信标的UUID
  • 停止广播region1,开始region2,一切正常,我的UITabelView现在向我显示region2 UUID
  • 停止region2并返回广播region1UITableView为空!找不到信标
  • 停止region1并重新启动region2,现在region2 UUID显示在我的UITableView中。从这一点开始,我的应用程序仅听region2加上我的UITableView颤抖(这意味着它很生涩)!!!,好像每半秒就会重新加载所有UI(例如,第1点和第2点不会发生的事情)

  • 我已经阅读了有关此问题的一些主题,并通过为每个区域使用不同的标识符解决了用户问题,但是我认为我使用的是不同的标识符,所以我不明白问题出在哪里!看起来无论何时输入region2,都会忘记region1

    谢谢提前

    最佳答案

    我遇到过类似的问题,就我而言,这是因为对didExitRegion:的回调未及时进行。如果没有对didExitRegion:的调用,那么我相信对didEnterRegion:的调用永远不会发生,因此您不会获得任何数据。关于该主题的文档很少,因为API仍然是相当新的。

    如您所建议的,使用不同的UUID邻近ID的解决方案是一个选择,尽管当主要/次要应该足以区分时,这样做令人沮丧。信标上的文档对此有所支持,称单个“使用”应使用单个UUID。因此,例如,一连串的商店将使用UUID来标识公司,Major来标识商店,而minor来标识商店内的位置。

    您是否在Radar中提交了错误?我建议在涉及这些方面的数量问题上。

    10-05 21:17