CoreLocation kCLErrorDomain 错误 5

9
我对一个CLRegion进行了子类化,通过重写containsCoordinate:方法使用射线投射逻辑来支持多边形,而不是原始的距离计算逻辑。该子类通过正常的方式初始化(initCircularRegionWithCenter:radius:identifier:),然后将CLLocationCoordinate2d作为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个回答

20

我不想回答自己的问题,但我找到了解决我的问题的方法。 kCLErrorDomain 错误代码 5 表示您尝试监视的 CLRegions 超过 20 个。在我的情况下,两个子类都监视了超过 20 个区域。


6
查看其他答案;错误代码5并不表示这个问题,它似乎是各种错误情况的“总捕获”代码。 - Carlos P
如果您尝试添加超过20个信标,则会收到“does not only denote this”消息。 - Ian Dundas
我也遇到了同样的问题,添加25个信标会返回5个上述错误代码。 - user1872384
1
你可以在监控一个区域时获得这个问题,但这不应该是对于“CoreLocation kCLErrorDomain error 5”的接受答案,即使它是针对OP的答案,也许更新问题以便其他人不会来到这里。 - Saik Caskey
我可以确认超过20个地区会触发此问题,实际上当uuuid(最后一个十六进制单元)大于19(UInt8(19))时会出现此问题。 - Cristian Zumelzu
显示剩余3条评论

11
它也会发生在以下情况下:
停止监视某个区域。
[self.manager stopMonitoringForRegion:region];

稍后请求国家监测所有区域:

for (CLRegion *region in self.manager.monitoredRegions) {
    [self.manager requestStateForRegion:region];
}

因为IOS似乎已禁用该区域的监测功能,但尚未从监测区域数组中删除,所以您将获得kCLErrorDomain 5错误。

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];
    }
}

发生了什么事情我不确定。如果解决方案只是显示警告,那就太好了。 - PH7
2
在Google搜索了一番后,我发现了这个链接http://www.cocoanetics.com/2014/05/radar-monitoring-clregion-immediately-after-removing-one-fails/..它起作用了..耶!!. - PH7
在相同的情况下,我该怎么做才能避免这个错误?我需要同时停止监视一个区域并开始监视另一个区域。 - PGDev

7

另外,如果您正在测试iBeacons,您不能使用iOS模拟器。


3

当您的纬度和经度值不合理时,也可能会返回此错误代码。(例如,我曾经调换过它们,并且为此错误感到困扰了一段时间。)


1
我花了多长时间来寻找这个问题,最终发现是我也颠倒了它们 :-D 谢谢! - Kai
很有帮助,我注意到一个用户的设备似乎无法获取准确的 GPS 位置。 - Saik Caskey

2

如果添加的CLRegionnil,也会出现此错误。


3
那也许是一个通用的错误代码。懒惰的苹果工程师 xD - Nate Symer

0
如果有人仍然在苦苦挣扎,可以看看这里:
在我的情况下,我必须在调用startMonitoring之前立即调用requestAlwaysAuthorization,这样就可以完美解决了!
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/提供的帮助。

-1
我遇到了这个错误,因为我没有启动蓝牙。 所以...不要忘记启动您的蓝牙 ;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接