CLLocationManager从不向用户询问位置服务

时间:2015-03-27 02:20:22

标签: ios objective-c cllocationmanager

我有一个仅限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中运行。但是我一直在寻找洞察力,它看起来很像对我来说好像我正在做的一切。

任何想法和/或建议?提前谢谢。

3 个答案:

答案 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(不包含在应用程序的构建中)会导致该问题,但似乎是这种情况。