如何使用CoreLocation获取多个iBeacons?

时间:2014-04-04 13:44:08

标签: ios objective-c core-location ibeacon

我正在尝试使用CoreLocation来获取我的iOS应用程序指定的多个iBeacons - 这个想法是,如果它们在范围内,它会在发现它们时通知我每一个。

问题是在didEnterRegion和didExitRegion方法中,我必须提供一个CLBeaconRegion对象。每个iBeacon都有一个,如果我只使用一个iBeacon,我可以使用它,但由于有几个,我需要知道如何从这些方法中找到每个CLBeaconRegion。

也许我误解了它的运作方式;如果是的话,请告诉我。

- (void)getForUUUIDs:(CDVInvokedUrlCommand *)command
{
        //Get an array of UUID's to filter by
        self->locationUUIDs = [self getArgsObject:command.arguments];

        self->locationManager = [[CLLocationManager alloc] init];
        self->locationManager.delegate = self;
        scanCallback = command.callbackId;

        for(NSInteger i = 0; i < [locationUUIDs count]; i++) {
            NSString *identifier = [NSString stringWithFormat:@"BLERegion %d",i];
            CLBeaconRegion *thisRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[locationUUIDs  allKeys] objectAtIndex:i] identifier:identifier];
            [self->locationManager startMonitoringForRegion:thisRegion];
        }
}

    - (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion*)region
{
    [self->locationManager startRangingBeaconsInRegion:????];
}

-(void)locationManager:(CLLocationManager*)manager didExitRegion:(CLRegion*)region
{
    [self->locationManager stopRangingBeaconsInRegion:????];
}

2 个答案:

答案 0 :(得分:4)

在触发监视器进入/退出事件的同一区域上进行测量非常简单:

- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion*)region
{
    [self->locationManager startRangingBeaconsInRegion:(CLBeaconRegion *)region];
}

这将从您用于开始监控的完全相同的区域开始。请注意,传递给回调的区域参数。该Region参数将包含您之前设置的相同UUID。

另一点:虽然当你进入一个区域时开始测距并且当你退出一个区域时停止测距没有任何问题,但实际上没有必要这样做。只需在开始监控的同时启动范围。因为当iBeacon不可见时,测距不会做任何事情,最终结果几乎相同。唯一的区别是如果你提前设置它,你可能会更快地获得第一个测距回调。电池或系统资源没有额外消耗。

提前设置它的额外好处是你不必进行CLRegion对象的转换 - 你有原始对象开始。而且您不必实现监视回调方法,因此您的代码更简单。像这样:

- (void)getForUUUIDs:(CDVInvokedUrlCommand *)command
{
    //Get an array of UUID's to filter by
    self->locationUUIDs = [self getArgsObject:command.arguments];

    self->locationManager = [[CLLocationManager alloc] init];
    self->locationManager.delegate = self;
    scanCallback = command.callbackId;

    for(NSInteger i = 0; i < [locationUUIDs count]; i++) {
        NSString *identifier = [NSString stringWithFormat:@"BLERegion %d",i];
        CLBeaconRegion *thisRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[locationUUIDs  allKeys] objectAtIndex:i] identifier:identifier];
        [self->locationManager startMonitoringForRegion:thisRegion];
        [self->locationManager startRangingBeaconsInRegion:thisRegion];
    }
}

答案 1 :(得分:0)

您的区域由uuid指定

self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                       identifier:identifier];

你所有的信标都必须分享那个uuid。因此,当您对信标进行测距时,可以使用该方法获取它们(CLLocationManagerDelegate)。

    -(void)locationManager:(CLLocationManager*)manager didRangeBeacons:(NSArray*)beacons inRegion:(CLBeaconRegion*)region
{
    for (CLBeacon *beacon in beacons) {
        NSLog(@"Major : %@", beacon.major);
        NSLog(@"Minor : %@", beacon.minor);
    }
}

主要和次要属性用于区分您的信标。