4

我正在尝试为 iOS 应用程序实现 iBeacon 范围。

[locationManager requestAlwaysAuthorization];
CLBeaconRegion * region = [self regionFromUUID:uuid];
[locationManager startMonitoringForRegion:region];

为了确定设备是在区域内还是区域外:

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [locationManager requestStateForRegion:region];
}

这成功调用:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if (state == CLRegionStateInside) {
        [locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region];
    } else {
        [locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region];
    }
}

并且该应用程序已成功使用locationManager:didRangeBeacons:inRegion:.

我遇到的问题是使用requestWhenInUseAuthorization. locationManager:didStartMonitoringForRegion:调用后[location requestStateForRegion:region],委托方法locationManager:monitoringDidFailForRegion:withError:返回错误代码 4:“操作无法完成”。

交换似乎绕过了这个错误并被requestStateForRegion成功调用。startRangingBeaconsInRegionlocationManager:didRangeBeacons:inRegion:

这是一个已知问题,[locationManager requestStateForRegion:region];如果仅kCLAuthorizationStatusAuthorizedWhenInUse被授予会导致错误代码 4?

4

2 回答 2

4

Apple 的Region Monitoring文档因为这段摘录而困扰着我:

如果授权状态为 kCLAuthorizationStatusAuthorized,则您的应用可以接收其注册的任何区域的越界通知。如果授权状态设置为任何其他值,则应用程序不会收到这些通知。

我在想kCLAuthorizationStatusAuthorized(在 iOS 8 中已弃用)将包括kCLAuthorizationStatusAuthorizedAlways并且kCLAuthorizationStatusAuthorizedWhenInUse因为它们都是特殊类型的“授权”。

感谢@heypiotr,我决定实际查看Apple Docs Declaration并注意到枚举声明如下:

kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedWhenInUse 

因此,requestStateForRegionrequireskCLAuthorizationStatusAuthorizedAlways因为这是唯一与 相同的值kCLAuthorizationStatusAuthorized,并且根据 Apple 的说法,它仅kCLAuthorizationStatusAuthorized适用于监控。

于 2016-03-21T21:39:23.420 回答
1

核心位置监控需要“始终”授权,即使您只是在应用程序处于活动状态时尝试进行监控。由于requestStateForRegion是监控 API 的一部分,它会解释为什么在“使用时”授权时会引发监控错误。

我能想到的唯一解决方法是,在“使用时”授权时,立即开始测距并使用测距结果,而不是requestStateForRegion确定您是在给定信标的范围内还是范围外。

于 2016-03-21T16:10:38.887 回答