CoreLocation kCLErrorDomain ошибка 5

Я подкласс CLRegion поддерживать полигоны через переопределение containsCoordinate: использовать логику приведения луча вместо оригинальной логики хруста расстояния. Подкласс инициализируется обычным методом (initCircularRegionWithCenter:radius:identifier:), затем CLLocationCoordinate2ds добавляются как 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;)

Другие вопросы по тегам