我通过重写containsCoordinate:
使用光线投射逻辑而不是原始的距离运算逻辑,将CLRegion
子类化以支持多边形。子类通过普通方法(initCircularRegionWithCenter:radius:identifier:
)初始化,然后将CLLocationCoordinate2d
s作为NSValue
s添加到可变数组中。这些坐标在光线投射逻辑过程中使用。
一旦我尝试使用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的子类化可行吗?
我不想回答自己的问题,但我已经找到了问题的解决方案。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
,也可能出现此错误。
如果有人还在为此而挣扎,那么看看这里:
在我的情况下,我不得不在呼叫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/为此。
我收到这个错误是因为我没有启动蓝牙。所以……别忘了启动蓝牙;)