提交我的应用程序后,我需要获取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);
.....
}
我真的尝试过很多方法来解决这个问题(不同的设备,允许手动设置隐私设置),但我不知道我的错误在哪里。
答案 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。