9

我将 a 子类化CLRegion以通过覆盖来支持多边形containsCoordinate:以使用光线投射逻辑而不是原始的距离计算逻辑。子类通过普通方法 ( initCircularRegionWithCenter:radius:identifier:) 初始化,然后将CLLocationCoordinate2ds 作为NSValues 添加到可变数组中。这些坐标在光线投射逻辑期间使用。

一旦我尝试使用 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 可行吗?

4

7 回答 7

20

我讨厌回答自己的问题,但我找到了解决问题的方法。kCLErrorDomain代码/错误 5 表示您已尝试监控超过 20CLRegions。就我而言,这两个子类都犯有监控 20 多个地区的罪行。

于 2013-07-19T03:13:27.083 回答
11

如果您:

停止监视区域

[self.manager stopMonitoringForRegion:region];

并在不久之后请求所有受监控区域的状态:

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

您将获得 kCLErrorDomain 5 因为 IOS 似乎已禁用对该区域的监控,但尚未将其从受监控的区域数组中删除

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];
    }
}
于 2014-06-04T08:38:03.380 回答
8

另外:如果您使用 iBeacons 进行测试,则不能使用 iOS 模拟器。

于 2014-05-13T07:21:20.427 回答
3

当您的纬度和经度值没有意义时,也可以取回此错误代码。(例如,我已经转置了它们,并且被这个错误困扰了一段时间。)

于 2013-08-07T17:20:45.560 回答
2

CLRegion如果添加is ,此错误也可能上升nil

于 2013-11-08T12:53:30.527 回答
0

如果有人仍在为此苦苦挣扎,请看这里:

在我的情况下,我必须在打电话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/

于 2018-05-26T05:06:47.343 回答
-1

我收到此错误是因为我没有启动蓝牙。所以...不要忘记启动您的蓝牙 ;)

于 2018-11-29T09:45:02.133 回答