使用CLLocationManager,我可以使用以下代码来确定是否可以访问设备上的位置服务。这是所有应用的主设置,可以打开和关闭。
if (self.locationManager.locationServicesEnabled) {
[self.locationManager startUpdatingLocation];
}
但是,用户可以拒绝访问单个应用,并且为了不执行代码来使用位置管理器,我需要知道用户是否批准访问此特定应用的位置服务。我看到有一个名为locationServicesApproved的属性,它似乎表明用户是否批准访问此应用程序中的位置服务。但它在2008年被删除了。
来源:http://trailsinthesand.com/apple-removes-notifications-from-iphone-sdk-beta-4/
似乎无法确定用户是否批准访问位置服务,但这似乎是SDK中的一个大漏洞。
SDK中的此功能是否在其他地方?我该怎么做才能确定用户是否已批准访问当前应用的位置服务?
答案 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
}