我有一个仅限IOS 8的应用程序,我想在其中使用位置服务来获取设备的纬度和经度。我认为我已经正确实现了一切,但是应用程序从不询问用户是否可以使用位置服务,CLAuthorizationStatus永远不会从kCLAuthorizationStatusNotDetermined和CLLocationManager委托方法更改
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
永远不会被召唤。
这是在viewcontroller的接口文件中定义的CLLocationManager:
__strong CLLocationManager *locationManager;
这是viewcontroller中的代码:
- (void)viewDidLoad{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status == kCLAuthorizationStatusNotDetermined) {
[locationManager requestWhenInUseAuthorization];
}
[locationManager startUpdatingLocation];
//... other viewDidLoad code
}
该应用的Info.plist文件有一个NSLocationWhenInUseUsageDescription条目。
调试跟踪显示该行
[locationManager requestWhenInUseAuthorization];
执行,但请求用户没有正确的位置服务的对话框不会出现。
此应用程序中的位置服务在iOS 7下正常工作 - 我显然做错了什么,或者没有做我需要做的事情才能让它在iOS 8中运行。但是我一直在寻找洞察力,它看起来很像对我来说好像我正在做的一切。
任何想法和/或建议?提前谢谢。
答案 0 :(得分:0)
你非常接近。让我看看我是否可以提供帮助。对于iOS 8,您需要先致电:
[self.locationManager requestWhenInUseAuthorization];
我建议您在代码行{... 1}}之后立即执行此操作(然后删除locationManager.delegate = self;
方法中的所有其他内容)。由于所有新的隐私内容,这与iOS 7不同。在调用此方法的委托回调之前,请不要调用viewDidLoad
。如果您阅读了文档,您会看到方法startUpdatingLocation
在完成后调用其回调方法:
requestWhenInUseAuthorization
在回调方法中,检查状态并根据值是什么来采取行动。这就是我的方法:
locationManager:didChangeAuthorizationStatus:
请注意,您不会看到警告询问应用是否可以每次都使用您的位置。看过一次之后,就不会再显示了。然后,用户可以控制应用是否可以在设备上的设置应用中访问他/她的位置。
答案 1 :(得分:0)
首先,检查 CLLocationManagerDelegate 是否定义,然后执行以下操作。
NSString *systenversion=[[UIDevice currentDevice] systemVersion];
if ([systenversion integerValue]>=8.0) {
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[locationManager requestAlwaysAuthorization];
}
}
[locationManager startUpdatingLocation];
和代表们,
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"didFailWithError: %@", error);
UIAlertView *errorAlert = [[UIAlertView alloc]
initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[errorAlert show];
}
- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined: {
NSLog(@"User still thinking..");
} break;
case kCLAuthorizationStatusDenied: {
NSLog(@"User hates you");
} break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
case kCLAuthorizationStatusAuthorizedAlways: {
[locationManager startUpdatingLocation];//Will update location immediately
[self showAlertWithTitle:@"Success" andMessge:@"Success to get current location"];
} break;
default:
break;
}
}
希望这有效。 :)
答案 2 :(得分:0)
我找到了解决方案,但我不知道为什么。我意识到我在应用程序文件夹的不同文件夹中有重复的info.plists。使用NSLocationWhenInUseUsageDescription条目,两个info.plists看起来是相同的。但当我删除应用程序导航窗口中未提及的应用程序时,应用程序开始按照所宣传的方式工作:获取请求警报,允许的位置服务和标题开始更新。不知道为什么相同的重复info.plist(不包含在应用程序的构建中)会导致该问题,但似乎是这种情况。