在执行CLLocationManager时,是否存在一个委托方法,当用户单击“允许”或“不允许”提示该请求使用位置时会调用该方法?
我尝试了这个但是在用户“允许”或“不允许”之后不会调用它。
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
此外,是否有一个变量可以告诉我用户选择了什么?
我尝试了以下内容,但总是返回true。
locationManager.locationServicesEnabled
谢谢你,
三通
答案 0 :(得分:7)
有一个委托方法
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
// user allowed
}
}
答案 1 :(得分:4)
[CLLocationManager locationServicesEnabled]
仅告知您是否在设备上启用了位置服务。
[CLLocationManager authorizationStatus]
会返回您要查找的实际状态。
答案 2 :(得分:1)
您必须实施didFailWithError:
方法:
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
if ([error domain] == kCLErrorDomain) {
// We handle CoreLocation-related errors here
switch ([error code]) {
// "Don't Allow" on two successive app launches is the same as saying "never allow". The user
// can reset this for all apps by going to Settings > General > Reset > Reset Location Warnings.
case kCLErrorDenied:
case kCLErrorLocationUnknown:
default:
break;
}
} else {
// We handle all non-CoreLocation errors here
}
}
编辑:查看CLLocationManager的参考资料我发现了这个:
+ (CLAuthorizationStatus)authorizationStatus
返回值 指示应用程序是否已获得授权的值 使用位置服务。
讨论管理给定应用程序的授权状态 由系统决定并由几个因素决定。申请必须是 明确授权用户使用位置服务 当前必须为系统启用位置服务。 此授权在您的申请时自动进行 首次尝试使用位置服务。
答案 3 :(得分:0)
locationManager.locationServicesEnabled
表示位置服务是否可用,但并不一定意味着它们适用于您的应用。
如果您需要查找某个时间点的状态,请使用CLLocationManager.authorizationStatus()
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
请注意,自iOS 8起,当您的应用程序首次尝试使用位置服务时,授权请求不会自动发生。在requestWhenInUseAuthorization()
实例上调用startUpdatingLocation()
之前,您需要明确致电CLLocationManager
。
并确保您在Info.plist中拥有NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
键,具体取决于您所使用的授权类型。如果缺少这些,则没有错误,没有日志,没有提示,没有任何可以指向正确方向的东西:)