在我的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天线,能够交替广播
region1
或region2
。region1
,一切正常,我的UITableView
充满了该信标的UUID
region1
,开始region2
,一切正常,我的UITabelView现在向我显示region2 UUID
region2
并返回广播region1
,UITableView
为空!找不到信标region1
并重新启动region2
,现在region2 UUID
显示在我的UITableView
中。从这一点开始,我的应用程序仅听region2
,加上我的UITableView
颤抖(这意味着它很生涩)!!!,好像每半秒就会重新加载所有UI(例如,第1点和第2点不会发生的事情) 我已经阅读了有关此问题的一些主题,并通过为每个区域使用不同的标识符解决了用户问题,但是我认为我使用的是不同的标识符,所以我不明白问题出在哪里!看起来无论何时输入
region2
,都会忘记region1
。谢谢提前
最佳答案
我遇到过类似的问题,就我而言,这是因为对didExitRegion:
的回调未及时进行。如果没有对didExitRegion:
的调用,那么我相信对didEnterRegion:
的调用永远不会发生,因此您不会获得任何数据。关于该主题的文档很少,因为API仍然是相当新的。
如您所建议的,使用不同的UUID邻近ID的解决方案是一个选择,尽管当主要/次要应该足以区分时,这样做令人沮丧。信标上的文档对此有所支持,称单个“使用”应使用单个UUID。因此,例如,一连串的商店将使用UUID来标识公司,Major来标识商店,而minor来标识商店内的位置。
您是否在Radar中提交了错误?我建议在涉及这些方面的数量问题上。