【问题标题】:CLLocationManager requestStateForRegion with "When In Use" location access error code 4带有“使用时”位置访问错误代码 4 的 CLLocationManager requestStateForRegion
【发布时间】:2016-03-17 22:26:30
【问题描述】:

我正在尝试为 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:

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

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

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

【问题讨论】:

  • 您的应用是否已禁用后台刷新?
  • 它没有被禁用。在CapabilitiesBackground Modes 下,我检查了Location Updates。在设备上,General > Background App Refresh 下,后台应用刷新一般是开启的。当应用程序在前台时会发生此错误。
  • 现在拍摄黑暗,但你有没有试过打电话给+requestWhenInUseAuthorization只是为了笑?
  • 是的,尝试请求WhenInUse。似乎是在 requestStateForRegion 上发生错误
  • 啊,粗鲁。我的意思是问你试过+requestAlwaysAuthorization吗?您在帖子中提到了+requestInWhenInUseAuthorization

标签: ios objective-c cllocationmanager ibeacon clbeaconregion


【解决方案1】:

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

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

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

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

kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized,
kCLAuthorizationStatusAuthorizedWhenInUse 

因此,requestStateForRegion 需要 kCLAuthorizationStatusAuthorizedAlways,因为这是唯一与 kCLAuthorizationStatusAuthorized 相同的值,并且根据 Apple 的说法,只有 kCLAuthorizationStatusAuthorized 可以用于监控。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 为什么 Apple Docs 说 kCLAuthorizationStatusAuthorized 是必需的,但 kCLAuthorizationStatusAuthorizedAlwayskCLAuthorizationStatusAuthorizedWhenInUse 的特殊“授权”类型并不是已弃用的 kCLAuthorizationStatusAuthorized 的同义词。我想我在答案中找到了问题的根源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2015-04-22
    • 2017-06-04
    相关资源
    最近更新 更多