如果用户已关闭位置服务(对于所有应用程序或仅为我的应用程序),CLLocationManager永远不会提示并且永远不会更新位置。这是可以预料的,但有没有办法检测位置服务是否已关闭,并提示重新启用它?
答案 0 :(得分:9)
根据docs,CLLocationManager有一个静态方法来查看是否启用了LocationServices:
+ (BOOL)locationServicesEnabled
答案 1 :(得分:5)
只是为了完成蒂姆的回答。
您始终可以尝试通过CLLocationManager实例上的startUpdatingLocation方法启动位置更新。如果禁用位置服务,您将通过委托获得有关错误情况的通知,然后您可以打开对话框,要求用户进入“设置”并为您的应用启用位置服务...
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)inManager didFailWithError:(NSError *)inError{
if (inError.code == kCLErrorDenied) {
NSLog(@"Location manager denied access - kCLErrorDenied");
// your code to show UIAlertView telling user to re-enable location services
// for your app so they can benefit from extra functionality offered by app
}
}
请注意,您可以通过iOS5上的URL-scheme启动“设置”应用程序(版本低于5.0(且大于5.0),不支持)。拨打:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"]];
答案 2 :(得分:1)
在尝试更新位置之前,您可以检查位置服务是否已启用。
以下是我使用的代码片段:
if (TARGET_IPHONE_SIMULATOR) {
currentLocation = [[CLLocation alloc] initWithLatitude:37.331718 longitude:-122.030629];
[self methodNameHere:currentLocation];
} else {
if ([CLLocationManager locationServicesEnabled]) {
[locationManager startUpdatingLocation];
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled" message:@"Enable location services to do this" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
}
}
基本上,代码检查你是否针对模拟器,如果你试图获取位置,这可能会给你错误,所以我只是硬编码我想要模拟的位置(在这种情况下,Apple HQ) 。如果定位设备,它会检查是否启用了位置服务,如果是,则调用您要执行的方法,如果没有,则会向用户显示警报消息。
答案 3 :(得分:0)
我认为更好的方法是做到这一点:
switch ([CLLocationManager authorizationStatus]) {
case kCLAuthorizationStatusAuthorizedWhenInUse:
case kCLAuthorizationStatusAuthorizedAlways:
//we're good to go
break;
default:
//pop up an alert
break;
}