【问题标题】:issues with geting location coordinate time to time不时获取位置坐标的问题
【发布时间】:2011-09-24 09:44:22
【问题描述】:

有时在我的应用上获取位置坐标时会出现问题。

我一直在测试我的应用程序从模拟器和坐在我家中的 iphone 的位置坐标(这不仅仅是我的家,我在不同的位置(室外)以及非常好的网络连接进行了测试),并且我看到这种有线行为,我现在有正确的坐标,然后我将应用程序发送到后台并将它带回来我得到正确的位置坐标,如果我这样做 8-10 次(即发送到背景并将其带到前台)有时在应用程序从后台运行后我无法获取位置坐标,此时获取位置坐标的唯一方法是杀死应用程序然后重新开始。所以我确定有些事情出了问题,但我不确定是什么。

这就是我正在做的事情

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
   //if the time interval returned from core location is more than 30 seconds we ignore it because it might be from an old session
   if ( abs([newLocation.timestamp timeIntervalSinceDate: [NSDate date]]) < 30) {

        if(newLocation.coordinate.latitude != previousLocation.coordinate.latitude && newLocation.coordinate.longitude != previousLocation.coordinate.longitude){

        if(newLocation.horizontalAccuracy <= 100){
            [self.locationManager stopUpdatingLocation];
            [self.locationManager startMonitoringSignificantLocationChanges]; 
   }
   else{
        [self.locationManager startUpdatingLocation];
   }

所以基本上我只在新位置不超过 30 秒时才使用它,并且它与我在本地存储的先前位置不同并且水平精度小于 100 米。当我在调试器中运行它时,我观察到的是我到达第一个 if 条件 3-4 次,如果它失败了,它不会在那之后出现,这意味着根本不会调用 didUpdateToLocation。

一旦坐标符合我的所有标准,我就会停止更新位置并开始监测重要位置变化。

我在 else 块中执行 startUpdatingLocation 的原因是。

例如,如果由于 startMonitoringSignificantLocationChanges 而调用了 didUpdateToLocation,我想在那之后获得准确的位置,所以每次我没有得到我正在寻找的正确位置时我都会执行 startUpdatingLocation,因为我相信执行多个 startUpdatingLocation 不会不伤害任何东西。

如果我的思维过程或代码逻辑有问题,请告诉我。

【问题讨论】:

    标签: iphone core-location cllocationmanager


    【解决方案1】:

    我首先要检查的是您的 info.plist。您必须包括关键的必需后台模式 -> 应用程序注册以进行位置更新。如果没有这个,您将不会在后台收到位置更新(除了重大的位置变化和区域监控)。

    在 main else 中,您调用 startUpdatingLocation。虽然我不相信这会伤害任何东西,除非你用 stopUpdatingLocation 来平衡它,我不相信它会做任何事情。文档说:

    连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopUpdatingLocation 确实会导致在您下次调用它时发送一个新的初始事件。

    但无论哪种方式,我认为您不需要告诉它再次开始更新,当超过 distanceFilter 属性或硬件收集更准确的位置读数时,它会自行继续。

    我没有看到您的第二个 if 的结束 }。

    【讨论】:

    • 我有 info.plist,问题不在于后台,问题发生在应用程序进入前台时。此处缺少关闭},但它不在代码中,否则我的代码将无法编译:)。因此,如果我正确理解文档,这意味着如果我调用 6 个启动日期位置,然后调用一个停止更新位置,iOS 将停止更新该位置,这并不重要我做了 6 次启动和 1 次停止。现在关于我必须研究的距离过滤器,到目前为止我还没有对它做任何事情。
    • @Yogesh 我只是对预期的功能感到好奇。我了解您正在寻找水平精度至少为 100m 的位置,然后切换到显着LocChanges。但是当你说进后台反复回到前台,那是什么目的呢?视图出现时是否应该更新其位置?至于您如何解释有关停止/开始更新位置的文档,我的看法相同,但会发现平衡开始呼叫和停止呼叫是更好的做法,即使它不会造成任何伤害。
    • 意图很明确,每次应用程序进入前台时都会更新位置,如果应用程序仍然在前台,则只有在位置发生重大变化时才更新位置,因为没有必要排干用于小的位置变化的电池。
    • @Yogesh 这取决于您的应用程序的用途。
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多