问题
I subclassed a CLRegion
to support Polygons via overriding containsCoordinate:
to use ray casting logic instead of the original distance crunching logic. The subclass is initialized via the normal method (initCircularRegionWithCenter:radius:identifier:
), then CLLocationCoordinate2d
s are added as NSValue
s to a mutable array. These coordinates are used during the ray casting logic.
As soon as I try to use the CLRegion subclass, I am confronted with a ton of errors in my application logic, as well as the following error:
2013-07-18 16:46:44.515 Geofencing[4816:907] (identifier 6C11CBAF-3EE4-4257-9D75-9724F4349B5D) <+39.86605072,-75.54420471> radius 186.54m: Error Domain=kCLErrorDomain Code=5 "The operation couldn’t be completed. (kCLErrorDomain error 5.)"
I also tried a different subclass that does not modify any methods but adds a method for reading metadata from an NSDictionary. I was confronted with the same error.
What is going on? Is subclassing CLRegion feasible?
回答1:
I hate to answer my own question, but I have found the solution to my issue. a kCLErrorDomain
code/error of 5 denotes that you have tried to monitor more than 20 CLRegions
. In my case, both subclasses were guilty of monitoring more than 20 regions.
回答2:
It also happens if you:
stop monitoring a region
[self.manager stopMonitoringForRegion:region];
and request the state for all monitored regions shortly afterwards:
for (CLRegion *region in self.manager.monitoredRegions) {
[self.manager requestStateForRegion:region];
}
you will get the kCLErrorDomain 5 because IOS seems to have disabled the monitoring for that region, but has not yet removed it from the monitoredRegions array
monitoringDidFailForRegion CLCircularRegion (identifier:'Home', center:<...>, radius:102.00m) The operation couldn’t be completed. (kCLErrorDomain error 5.)
monitoredRegion: CLCircularRegion (identifier:'Home', center:<...>, radius:102.00m)
monitoredRegion: CLBeaconRegion (identifier:'BeaconHome', uuid:<..., major:(null), minor:(null))
monitoredRegion: CLCircularRegion (identifier:'D...', center:<...>, radius:101.00m)
monitoredRegion: CLCircularRegion (identifier:'W...', center:<..>, radius:51.00m)
to work around that problem, do something like this:
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
{
NSLog(@"monitoringDidFailForRegion %@ %@",region, error.localizedDescription);
for (CLRegion *monitoredRegion in manager.monitoredRegions) {
NSLog(@"monitoredRegion: %@", monitoredRegion);
}
if ((error.domain != kCLErrorDomain || error.code != 5) &&
[manager.monitoredRegions containsObject:region]) {
NSString *message = [NSString stringWithFormat:@"%@ %@",
region, error.localizedDescription];
[AlertView alert:@"monitoringDidFailForRegion" message:message];
}
}
回答3:
Also: if you're testing with iBeacons, you can't use the iOS simulator.
回答4:
It is also possible to get this error code back when your latitude and longitude values don't make sense. (I'd transposed them, for example, and was vexed by this error for a while.)
回答5:
This error could also rise up if added CLRegion
is nil
.
回答6:
If anybody is still struggling with this then take a look here:
In my case, I had to call requestAlwaysAuthorization
just before calling startMonitoring
and it worked like charm!
locationManager.requestAlwaysAuthorization()
let currRegion = CLCircularRegion(center: CLLocationCoordinate2D(latitude: LAT, longitude: LONG, radius: 100, identifier: "MyLocation")
currRegion.notifyOnEntry = true
locationManager.startMonitoring(for: region)
Btw, I would love to thank https://shrikar.com/swift-tutorial-corelocation-and-region-monitoring-in-ios-8/ for this.
回答7:
I got this error because i did not start the Bluetooth. So... do not forget to start your Bluetooth ;)
来源:https://stackoverflow.com/questions/17733875/corelocation-kclerrordomain-error-5