Ranging on the same region that fired the monitor entry/exit event is extremely simple:
- (void)locationManager:(CLLocationManager*)manager didEnterRegion:(CLRegion*)region
{
[self->locationManager startRangingBeaconsInRegion:(CLBeaconRegion *)region];
}
This will start ranging on the exact same region you used to start monitoring. Note that there is a region parameter passed to the callback. That Region parameter will include the same UUID that you set up before.
One other point: while there is nothing wrong with starting ranging when you enter a region and stopping ranging when you exit a region, there is really no need to do this. Just start ranging the same time you start monitoring. Because ranging won't do anything when the iBeacon isn't visible, the end result will be almost identical. The only difference is you will probably get your first ranging callback one second sooner if you set it up ahead of time. There is no extra drain on battery or system resources.
The added benefit of setting it up ahead of time is that you don't have to do the casting of the CLRegion object -- you have the original object to begin with. And you don't have to implement the monitoring callback methods, so your code is simpler. Like this:
- (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];
}
}