【问题标题】:CLLocation- user location is lost (zero lat and long) on App resumeCLLocation - 应用恢复时用户位置丢失(零纬度和经度)
【发布时间】:2013-03-13 06:34:41
【问题描述】:

App从长时间挂起状态恢复时GPS信号丢失。
和/或用户进入 GPS 信号较弱的建筑物并然后恢复应用。

蓝点消失,地图以 lat:0 long:0 为中心(位于 尼日利亚-非洲附近的海洋) 如果您在该时间点启动另一个 GPS 应用程序,例如 Apple Maps, 你确实看到了蓝点,即使不是那么准确。

用户可以修复它的唯一方法是完全终止我的应用程序并重新启动它。

iOS 5.x 和 iOS 6.x 都会出现这种情况。

在详细介绍之前,我真的想问一下:
有人遇到过这个问题吗?
这很烦人,但是,我找不到任何人抱怨这个 网络上的任何地方 - 非常奇怪。

我正在使用带有 showUserLocation=YES 的普通 CLLocation,
没有什么神奇的,没有特殊的精度调整或其他什么,只是简单的默认值 实施。

我已经尝试在 App 恢复时重新启动所有可能的组件;

showUserLocation=NO;
showUserLocation=YES;

[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];

或 即使释放 locationManager 并再次初始化它也无济于事!
(也尝试使用 dispatch_after 延迟重启它)

是否有任何编程方式强制在 ios 中重置 GPS 信号或 CLLocation?
将不胜感激任何相关的讨论!

【问题讨论】:

  • 我偶尔会看到类似的情况,但不是在暂停和恢复期间,通常是在启动之间。

标签: ios objective-c mkmapview cllocation showuserlocation


【解决方案1】:

我认为您的默认位置设置为“无”,因此创建了此类问题。

Go to 

Edite Scheme..
    |
    |
  "Run YourProjectName"  / Left Hand Side
       |
       |
  Select "Option" Tab
         |
         |
     Default Location
          |
          |
     Choose any Location such like , "London England"

【讨论】:

  • 是的,它设置为无,我进行了更改并开始测试。很快就会报告。
  • 它确实提高了应用程序恢复后的 GPS 恢复能力。唯一的缺点是,在连接到 Xcode 的设备上进行测试时,它会模拟伦敦或其他任何地方,因为它是真实的 GPS 坐标。
【解决方案2】:

当您说您尝试停止/启动 CLLocationManager 对象时,您是说您在委托中获得的回调为您提供了 0,0 坐标,还是您尝试直接访问该位置使用CLLocationManager 中的location 属性?

我在一个基于位置的应用程序上工作,我可以告诉你的一件事是,你不能指望直接获取CLLocationManager 对象的位置。获取位置信息的唯一可靠方法是通过实现来依赖CLLocationManager 类的回调

-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

我在我的应用程序中处理CLLocationManager 的方式(现在我并不是说这对于您的用例来说是最佳或理想的,但它确实让我们能够在应用程序启动/恢复时为用户提供可靠的基于位置的体验)

  1. CLLocationManager 包装到位置管理类中(通常使用单例) - 我认为这可以是CLLocationManager 的子类,但在我的情况下,它只是NSObject 的子类,带有CLLocationManager 对象作为属性
  2. 在这个单例中存储最后一个已知的有效位置,然后将其写入磁盘(NSUserDefaults 或其他位置 - 需要重新检查是否允许将用户位置存储在 NSUserDefaults 但我们已经在我们的应用,似乎不会影响审批流程)
  3. 重新实现一种在您的自定义类中获取当前位置的方法 - 基本上检查 CLLocationManager 是否返回 0,0,如果是,则返回您的缓存位置
  4. 不是绝对必要的,但是如果您有多个视图/页面需要使用该位置,那么实现观察者模型效果很好(因为您的单例现在是CLLocationManager 的代表,您需要有一种方法来传递此信息到您的视图控制器上)。

有了以上内容,在我的地图页面上(或在我显示用户位置的任何地方) - 我基本上用缓存的位置更新地图一次(在viewDidLoad 中),然后我允许通过委托对地图进行一次更新-打回来。一旦收到该回调,我将showsUserLocation 设置为YES(如果未调用回调,则您还没有有效的位置,因此在该点设置showsUserLocation 不会'什么都不做)。

我希望这会有所帮助,如果您有任何其他问题,请随时告诉我!

【讨论】:

  • 感谢您分享您的应用设计,这听起来确实是一个可靠的解决方案。当我说 0,0 时,我的意思是我通过回调得到的。从这个阶段开始,蓝点就永远消失了。如果您能解释一下您在第 3 步中创建/伪造用户位置的方法(使用真正的蓝点和默认注释?)。
  • 如果你想模拟默认注释,最简单的方法是使用 Sam Vermette 的github.com/samvermette/SVPulsingAnnotationView - 他是一个很棒的编码器,我用过的每个类都已经死了-实现简单(SVProgressHUD、SVPullToRefresh、SVInfiniteScrolling)。只需将其放在缓存位置(假设您在应用程序进入后台之前将位置缓存到磁盘)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2017-08-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多