didUpdateLocations未调用

use*_*438 31 xcode objective-c cllocationmanager cllocation ios

我正在尝试获取当前位置,但是didUpdateLocations中的断点永远不会被调用.

的LocationManager:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)

代表方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
Run Code Online (Sandbox Code Playgroud)

我确认了位置服务并启用并授权.

为什么没有像它应该调用locationManager委托方法?

谢谢,迈克

Mar*_*ass 70

此外,在iOS8中,你必须有两件额外的东西:

  • 添加一个密钥Info.plist并请求位置管理员授权启动.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • 您需要请求相应位置方法的授权.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

代码示例:

self.locationManager = [[CLLocationManager alloc] init];
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(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)

资料来源:http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

  • 请注意,在iOS 11中,必须为info.plist提供第三个密钥:NSLocationAlwaysAndWhenInUseUsageDescription (2认同)

Tim*_*eit 30

当我遇到这个问题时,这是由于线程问题.

确保在主线程上调用所有这些方法.非常重要的是,不仅要startUpdatingLocation在主线程上调用该方法,还要调用其他方法.

您可以通过将代码包装在主线程上来强制代码在主线程上运行

dispatch_sync(dispatch_get_main_queue(), ^{

});
Run Code Online (Sandbox Code Playgroud)

还看看这个答案.


Gab*_*ana 9

确保将CLLocationManager添加为属性.

@property (nonatomic , strong) CLLocationManager *locationManager;
Run Code Online (Sandbox Code Playgroud)


Zol*_*ler 6

是的,该属性是我的解决方案,并且最好检查位置服务是否已启用:

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}
Run Code Online (Sandbox Code Playgroud)