2014-09-30 66 views
2

我有一个应用程序,收集经纬度/长坐标只使用iPad中的GPS芯片(IE没有WiFi或ios8蜂窝)。它似乎一直工作,除非应用程序闲置大约一个小时(应用程序仍然打开,但iPad锁。)这是我的代码CoreLocation停止获取更新后空闲

我通过按UIButton获取坐标并存储在IBAction中调用[self.locman startUpdatingLocation];他们到文档目录中的文本文件。

// Delegate method from the CLLocationManagerDelegate protocol. 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray *)locations { 
    // If it's a relatively recent event, turn off updates to save power. 
    CLLocation* location = [locations lastObject]; 
    NSDate* eventDate = location.timestamp; 
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; 
    if (abs(howRecent) < 1) { 
     self.lat = [NSString stringWithFormat:@"%.8f",location.coordinate.latitude]; 
     self.longString = [NSString stringWithFormat:@"%.8f",location.coordinate.longitude]; 
     [self.locman stopUpdatingLocation]; 
    } 
} 

此外,如果它没有一个小时漫长的沉寂获得更新,该应用程序也将随之得到更新,如果用户在一个小时内再次按下按钮。所以这似乎是一个热身问题。

澄清。这似乎是一个时间问题。出于测试目的,我会收集坐标....开车5分钟,并收集坐标。我可以在停止之间以5分钟的间隔做足够多次。无论屏幕变成空白还是我按下“睡眠”按钮,这都可以很好地工作。当我单独离开ipad大约一个小时(路程超过5分钟)时,问题就出现了。然后,该应用会给我0.000000和0.0000000的坐标。

这是我的位置管理器的实例。

self.locman = [[CLLocationManager alloc] init]; 
    //self.locman.pausesLocationUpdatesAutomatically = NO; 
    self.locman.delegate = self; 
    self.locman.desiredAccuracy = kCLLocationAccuracyBest; 
    self.locman.distanceFilter = kCLDistanceFilterNone; 
    self.locman.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
+1

所以你面临的问题是,当应用程序打开但iPad被锁定时,位置没有更新? – 2014-10-08 19:21:26

+0

请参阅我的编辑 – user2402616 2014-10-08 20:34:54

回答

2

您不应该停止更新最近更新的位置,让框架处理频率。检查时间戳以确保您没有旧的位置数据是个不错的主意 - 位置管理器通常会立即提供先前缓存的位置数据,然后在可用时提供更新的位置数据。

这是哪一个iOS版本?在iOS 8中,您需要拨打requestAlwaysAuthorization才能在后台接收位置更新。

您可以提供更多关于如何设置位置管理器的详细信息吗?

您的应用程序在某段时间后可能会被系统杀死。如果发生内存泄漏,可能会发生这种情况。

+0

请查看我的编辑以了解如何设置位置管理器。另外,我正在使用ios8。同样在我的原始代码中,我正在检查时间戳以抛出缓存的数据;它只是在很长一段时间后才起作用。也许我必须让'如何最近'更高?我会试着看看注释'stopUpdatingLocation'是干什么的。虽然我相信这只会产生多个坐标,因为位置管理器永远不会停止(我不想要的行为) – user2402616 2014-10-10 17:34:36

+1

在原始代码中,当时间戳最近时,您将停止位置管理器的更新。如果你这样做,当时间戳已经足够时,'self.lat'和'self.longString'将被设置一次,然后你将不再接收更新,除非你在其他地方重新启动。另外,你设置了'self.locman.desiredAccuracy'两次;第一条语句被忽略。 – wrightak 2014-10-20 06:55:31