【问题标题】:Latidude and Longitude are incorrect first time app is launched ios首次启动应用程序时纬度和经度不正确 ios
【发布时间】:2016-04-15 15:19:49
【问题描述】:

我正在使用 CLLocationManager 来获取用户的当前位置。我需要用户的当前位置,因为无论用户在哪里,我都使用 Open Weather Api 来显示天气数据。我的问题是我第一次打开应用程序时,经纬度值是 0、0。但是如果我再次运行应用程序,它就可以正常工作。所以只有在应用程序第一次启动时才使用不正确的 lat 和 long 值。我在 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 中获取 lat 和 long 有关吗?

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

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

【问题讨论】:

  • 该代码没有显示您如何获取和处理位置值。我建议你也分享这个。还有,是模拟器还是真机?
  • 好的,现在发布该代码。我正在使用一个实际的设备。这个错误发生在模拟器和设备上。
  • 你是说这两行是在同一个块/方法中的前面的代码行之后吗?
  • 不,这些是我传递给向开放天气 api 发出 http 请求的方法的内容

标签: ios cllocationmanager cllocation openweathermap


【解决方案1】:

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

当您再次启动应用时,位置管理器检测到您已授予权限,因此它会非常快速地为您提供当前位置坐标。

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

希望对你有帮助!

【讨论】:

  • 谢谢它对我有用。我所做的是在 NSUserDefaults 中检查这是否是用户第一次启动应用程序,如果是我将布尔值设置为 true。然后在视图控制器中,我检查了布尔值,如果它是真的,我使用 dispatched 在 5 秒后执行 http 请求。
【解决方案2】:

您应该检查CLLocation 对象的horizontalAccuracy 是否有负值,如果是这种情况,请不要使用纬度/经度值。当您看到纬度/经度值为 0/0 时,很可能是 GPS 未锁定位置。

【讨论】:

  • 水平精度为65,怎么办?我是否应该添加一个完成处理程序,并且只在检索到纬度和经度后才显示天气?
  • 您应该检查天气服务的粒度,并与 GPS 的水平精度进行比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多