即使在Info.plist中使用NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription,iOS locationmanager也不会询问用户权限

时间:2015-09-07 19:08:17

标签: ios core-location cllocationmanager

提交我的应用程序后,我需要获取CoreLocation(#import)的用户位置,但它永远不会问我许可警报。

ViewController.h

#import "RootViewController.h"
#import < UIKit/UIKit.h >
#import < CoreLocation/CoreLocation.h >

@interface AroundMeViewController : RootViewController <CLLocationManagerDelegate>

@property(nonatomic, strong) CLLocationManager *locationManager;

...

@end

__________

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

NSLog(@"LOG: %d", [CLLocationManager locationServicesEnabled]);

self.locationManager = [[CLLocationManager alloc] init];
// Set a delegate to receive location callbacks
self.locationManager.delegate = self;

// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [self.locationManager requestAlwaysAuthorization];
}

....
// Start the location manager
[self.locationManager startUpdatingLocation];

NSLog(@"LOG: %@", self.locationManager);

.....

}

我真的尝试过很多方法来解决这个问题(不同的设备,允许手动设置隐私设置),但我不知道我的错误在哪里。

1 个答案:

答案 0 :(得分:0)

根据NSHipster,必须明确询问使用位置服务的权限,并且是异步提供的,因此我们无法像以前那样立即启动位置更新。我们需要实现

    locationManager:didChangeAuthorizationStatus

委托方法并在那里开始更新位置。每当auth状态根据用户输入改变时,都会调用此方法。

当设置locationManager时,似乎也调用了这个委托方法,因为当我仍然显示启动画面时我正在触发(当我设置了mapManager委托时,我怀疑),然后当我调用triggerLocationServices()时再次触发。这可能是有效的&#34;沉默&#34;你的申请。

我将方法更改为以下内容:

    func triggerLocationServices() {
        if CLLocationManager.locationServicesEnabled() {
            if self.locationManager.respondsToSelector("requestAlwaysAuthorization") {
                // request authorization to use location
            } else {
                // start updating location
            }
        }
    }

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus){
        if status == .AuthorizedAlways || status == .AuthorizedWhenInUse {
            // start updating location
        } 
        else {
            triggerLocationServices()
        }
    }

并删除了对triggerLocationServices()的任何其他调用。这个以及正确的info.plist键为我解决了这个问题。

为Swift代码道歉,希望你能转化为Obj-C。