1

当我的应用程序从背景带到前景时,我需要我的应用程序显示非常准确的纬度和经度坐标。

我在这样做时遇到了很多麻烦。当我将我的应用程序置于后台时,位置服务会关闭。我曾考虑启用后台定位模式,但我知道这样做可能会导致用户的电池耗尽。我也尝试过使用startMonitoringSignificantLocationChanges,但这似乎并不准确。

我的视图有一个按钮,单击时会显示用户的坐标。在四处走动时单击按钮时,坐标是准确的。但是如果用户唤醒应用程序并立即点击按钮,坐标就会偏离。谁能帮我这个?启用后台定位模式是我唯一的选择吗?在位置准确之前,我可以禁用按钮吗?任何帮助将不胜感激!

我的视图从我的应用程序委托中设置的 locationManager 中提取坐标,如下所示:

这是视图:

-(void>buttonClick {

NSString *userLatitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLatitude];

NSString *userLongitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLongitude];
}

这是应用程序委托:

- (NSString *)getUserLatitude {
    NSString *userLatitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.latitude];
    return userLatitude;
}

- (NSString *)getUserLongitude {
    NSString *userLongitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.longitude];
    return userLongitude;
}
4

3 回答 3

1

点击按钮更新您的位置管理器。您需要等到它提供准确的位置。

检查这个 如何等到位置管理器获得高精度数据

于 2013-08-02T08:17:38.420 回答
0

在它的文档中startUpdatingLocation说:

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

所以我建议“重新初始化”位置管理器

[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];

使用应在几秒钟后调用的委托回调locationManager:didUpdateLocations:来更新要显示给用户的坐标。

PS:如果您使用延迟位置更新,您必须确保您拨打disallowDeferredLocationUpdates.

于 2013-08-02T08:10:20.387 回答
0

我认为您使用了错误的方法。

如您所见,GPS需要一定的时间才能获得固定位置,这是因为 GPS 的工作原理,您无法更改它。GPS 可能需要一分钟才能获得精确的位置,因此在所有 iOS 设备(以及现在市场上的所有智能手机)中,您已经辅助 GPS,它使用蜂窝无线电和 wi-fi 三角测量,以便几乎立即提供大致位置。实际上desiredAccuracy,CLLocationManager 使用指定的能力来打开或关闭特定传感器,例如,如果您指定kCLLocationAccuracyKilometerGPS 永远不会打开并且只使用蜂窝 + wifi 的一个很好的变化(因为这更快并且节省大量电池)

startMonitoringSignificantLocationChanges顾名思义,仅用于用户位置的重大(广泛/大)变化,并不能解决您的问题。请记住,作为用户,我不喜欢应用程序继续监视我的位置,即使我知道它不需要它:这可能是杀死或卸载您的应用程序的原因。

也就是说,它认为你能做的最好的事情就是等待或告诉用户你向他展示了一个位置,但可能并不准确(以 RunKeeper 为例)。iOS 中的很多事情都是异步发生的,而不是强迫你的应用程序设计,因为这些事情是瞬间发生的,拥抱这个异步世界。

如果根据设计您需要一个精确的位置,您可以禁用该按钮,并等到 CLLocationManger 的代表告诉您 ( locationManager:didUpdateLocations:) 您已达到所需的精度(您可以通过查看CLLocation's来达到此目的horizontalAccuracy)然后启用该按钮.

一点注意:CLLocationManager 缓存了最后的位置,因此在做任何逻辑之前一定要检查 CLLocation 的时间戳。

于 2013-08-02T08:12:12.587 回答