Yes you can, the best way to do this is to start ranging when you register for region monitoring.
[self.locationManager startMonitoringForRegion:region];
[self.locationManager startRangingBeaconsInRegion:region];
Then after you receive the region callback while you are in the background you will get about 5 seconds of ranging.
I would define the following callbacks:
- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state
forRegion:(CLRegion *)region
{
// Get the initial state of the beacon regions
}
- (void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region
{
// Get updates for the beacon regions
}
- (void)locationManager:(CLLocationManager *)manager
didRangeBeacons:(NSArray *)clBeacons
inRegion:(CLBeaconRegion *)region
{
// Get ranges for actual beacons
}
Just remember that you only get a limited time to do the ranging, and once that background time is over you will stop receiving callbacks.
This means that you only have a few seconds to determine you location. So if you want to trigger an event when the person is a certain distance that might be missed because the background process was stopped by iOS
But if you own the iBeacon hardware you can work around this limitation by adjusting the power output that it is broadcasting. We have been successful by dialing down the power so that the enter region event does not occur until you are very close by the beacon. Estimated distances will need to be recalibrated if you do this, but it can get the job done.