CoreLocation kCLErrorDomain ошибка 5
Я подкласс CLRegion
поддерживать полигоны через переопределение containsCoordinate:
использовать логику приведения луча вместо оригинальной логики хруста расстояния. Подкласс инициализируется обычным методом (initCircularRegionWithCenter:radius:identifier:
), затем CLLocationCoordinate2d
s добавляются как NSValue
с изменяемым массивом. Эти координаты используются во время логики приведения лучей.
Как только я пытаюсь использовать подкласс CLRegion, я сталкиваюсь с кучей ошибок в логике своего приложения, а также со следующей ошибкой:
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.)"
Я также попробовал другой подкласс, который не изменяет никакие методы, но добавляет метод для чтения метаданных из NSDictionary. Я столкнулся с той же ошибкой.
Что здесь происходит? Возможно ли создание подклассов CLRegion?
7 ответов
Я ненавижу отвечать на свой вопрос, но я нашел решение своей проблемы. kCLErrorDomain
Код / ошибка 5 означает, что вы пытались контролировать более 20 CLRegions
, В моем случае оба подкласса были виновны в мониторинге более 20 регионов.
Это также происходит, если вы:
прекратить мониторинг региона
[self.manager stopMonitoringForRegion:region];
и вскоре после этого запросите состояние для всех контролируемых регионов:
for (CLRegion *region in self.manager.monitoredRegions) {
[self.manager requestStateForRegion:region];
}
вы получите kCLErrorDomain 5, потому что IOS, похоже, отключил мониторинг для этого региона, но еще не удалил его из массива monitoredRegions
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)
Чтобы обойти эту проблему, сделайте что-то вроде этого:
- (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];
}
}
Также: если вы тестируете с iBeacons, вы не можете использовать симулятор iOS.
Также возможно вернуть этот код ошибки, когда ваши значения широты и долготы не имеют смысла. (Я перенес их, например, и некоторое время был недоволен этой ошибкой.)
Эта ошибка также может возрасти, если добавить CLRegion
является nil
,
Если кто-то все еще борется с этим, посмотрите здесь:
В моем случае мне пришлось позвонить requestAlwaysAuthorization
как раз перед звонком startMonitoring
и это сработало как шарм!
locationManager.requestAlwaysAuthorization()
let currRegion = CLCircularRegion(center: CLLocationCoordinate2D(latitude: LAT, longitude: LONG, radius: 100, identifier: "MyLocation")
currRegion.notifyOnEntry = true
locationManager.startMonitoring(for: region)
Кстати, я хотел бы поблагодарить https://shrikar.com/swift-tutorial-corelocation-and-region-monitoring-in-ios-8/ за это.
Я получил эту ошибку, потому что я не запустил Bluetooth. Так что... не забудьте запустить Bluetooth;)