当用户拒绝访问位置服务时,如何使用CLLocationManager确定?

时间:2010-03-13 20:40:26

标签: iphone objective-c gps

使用CLLocationManager,我可以使用以下代码来确定是否可以访问设备上的位置服务。这是所有应用的主设置,可以打开和关闭。

if (self.locationManager.locationServicesEnabled) {
    [self.locationManager startUpdatingLocation];
}

但是,用户可以拒绝访问单个应用,并且为了不执行代码来使用位置管理器,我需要知道用户是否批准访问此特定应用的位置服务。我看到有一个名为locationServicesApproved的属性,它似乎表明用户是否批准访问此应用程序中的位置服务。但它在2008年被删除了。

来源:http://trailsinthesand.com/apple-removes-notifications-from-iphone-sdk-beta-4/

似乎无法确定用户是否批准访问位置服务,但这似乎是SDK中的一个大漏洞。

SDK中的此功能是否在其他地方?我该怎么做才能确定用户是否已批准访问当前应用的位置服务?

3 个答案:

答案 0 :(得分:4)

取自这个答案:locationServicesEnabled test passes when they are disabled in viewDidLoad

  

locationServicesEnabled类方法仅测试全局设置   位置服务。 AFAIK,没有办法测试你的应用程序是否有   明确否认。您必须等待位置请求   失败并使用CLLocationManagerDelegate方法   locationManager:didFailWithError:做你需要的任何事情。 E.g。

- (void)locationManager: (CLLocationManager *)manager
       didFailWithError: (NSError *)error {

    NSString *errorString;
    [manager stopUpdatingLocation];
    NSLog(@"Error: %@",[error localizedDescription]);
    switch([error code]) {
        case kCLErrorDenied:
            //Access denied by user
            errorString = @"Access to Location Services denied by user";
            //Do something...
            break;
        case kCLErrorLocationUnknown:
            //Probably temporary...
            errorString = @"Location data unavailable";
            //Do something else...
            break;
        default:
            errorString = @"An unknown error has occurred";
            break;
        }
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:errorString delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
}
  

请参阅有关CLError常量的文档   CLLocationManager class reference了解更多选项。

答案 1 :(得分:0)

我在上述问题的评论中回答了我自己的问题。

答案(从上面的评论中复制):

您似乎必须等待调用locationManager:didFailWithError:并且错误代码将指向CLError.h中的值。值为kCLErrorLocationUnknown,kCLErrorDenied,kCLErrorNetwork和kCLErrorHeadingFailure。似乎第二个值是我应该检查以查看用户是否拒绝访问位置服务。

答案 2 :(得分:0)

从iOS 4.2开始,您可以使用CLLocationManager中的全局方法+ (CLAuthorizationStatus)authorizationStatus

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
    //User denied access to location service for this app
}