35

我正在尝试获取当前位置,但从未调用过 didUpdateLocations 中的断点。

位置管理器:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];

委托方式:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

我确认位置服务并启用和授权。

为什么没有像应有的那样调用 locationManager 委托方法?

4

8 回答 8

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];

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

于 2014-09-22T16:24:45.477 回答
33

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

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

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

dispatch_sync(dispatch_get_main_queue(), ^{

});

另请查看此答案

于 2013-11-13T23:42:57.850 回答
10

确保将 CLLocationManager 添加为属性。

@property (nonatomic , strong) CLLocationManager *locationManager;
于 2014-01-28T17:39:09.920 回答
6

是的,该物业是我的解决方案,检查定位服务是否启用是个好主意:

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}
于 2014-01-29T10:39:44.517 回答
3

您必须告诉模拟器要模拟的位置。如果您不指定位置,您的CLLocationManager委托方法将永远不会被调用。您可以使用模拟器菜单 Debug -> Location。同样在调试区域下方的 Xcode 中,从 Xcode 运行应用程序时会出现一个小位置箭头。您可以使用它来指定 GPX 文件来模拟运动(尽管它仍然与真实设备不同)。

https://devforums.apple.com/message/1073267#1073267

于 2014-11-15T15:54:33.320 回答
3

如果设置了 CLLocationManagerDelegate,则还设置了 MapView Delegate

还要检查模拟器的位置,单击模拟器 > 调试 > 位置,如果没有,则更改为城市运行或高速公路驱动。它对我有用。

于 2016-08-30T10:49:49.627 回答
3

请注意,在 iOS 11 及更高版本中,必须向 info.plist 提供第三个密钥:NSLocationAlwaysAndWhenInUseUsageDescription

于 2018-10-01T08:39:46.660 回答
0

在我将 my 的属性didUpdateLocations更改为以下值后,我的应用程序有时会在第一次调用时出现多分钟延迟:desiredAccuracyCLLocationManagerkCLLocationAccuracyKilometer

myLocationManager.desiredAccuracy = kCLLocationAccuracyKilometer; 
[myLocationManager startUpdatingLocation]; // Occasional long delay

将其更改回 后,再次开始kCLLocationAccuracyBest的调用总是立即发生:didUpdateLocations

myLocationManager.desiredAccuracy = kCLLocationAccuracyBest; 
[myLocationManager startUpdatingLocation]; // Calls didUpdateLocations immediately
于 2020-09-18T14:04:22.153 回答