首次启动应用程序时纬度和经度不正确 ios

Latidude and Longitude are incorrect first time app is launched ios

我正在使用 CLLocationManager 获取用户的当前位置。我需要用户的当前位置,因为我正在使用 Open Weather Api 来显示用户所在位置的天气数据。我的问题是,我第一次打开该应用程序时,纬度和经度值为 0、0。但是如果我再次 运行 该应用程序,它就可以正常工作。因此,只有在首次启动应用程序时,才会使用不正确的纬度和经度值。我在 viewDiDLoad 中进行了所有设置,这是代码...

locationManager = [[CLLocationManager alloc] init];
[locationManager requestAlwaysAuthorization];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    [self->locationManager requestWhenInUseAuthorization];

[locationManager startUpdatingLocation];

我不知道我做错了什么。这与在视图控制器而不是 App Delegate 中获取纬度和经度有关吗?

这是我获取位置值的方式:

locationManager.location.coordinate.latitude
locationManager.location.coordinate.longitude

您应该检查 CLLocation 对象的 horizontalAccuracy 是否为负值,如果是,则不要使用 lat/lon 值。当您看到 lat/lon 值为 0/0 时,很有可能是 GPS 没有锁定位置。

发生这种情况是因为当您第一次启动您的应用程序时,位置管理器 会请求用户访问当前位置的权限,并且当用户允许时 - 获取当前位置的过程只需要很少的时间并且您在完成该过程之前访问坐标。

当您再次启动您的应用程序时 位置管理器 检测到您已经授予权限,因此它会很快为您提供当前位置坐标。

所以解决方案是 - 您必须等到它完成位置更新选项。您可以使用 dispatch 在那里放置一些延迟,或者可以使用位置管理器委托方法 didUpdateUserLocation 或者如果您的 UIViewController 不是初始视图控制器 - 在在这种情况下,你应该在 AppDelegate 中实现这个过程,在 didFinishLaunching 中使用你的代码,所以当你打开你的视图控制器时(无论你使用的是什么导航流程),位置细节都会在那里同时位置管理器将跟踪您的位置。

希望对您有所帮助!