将应用程序带到前台时获取准确的坐标
Posted
技术标签:
【中文标题】将应用程序带到前台时获取准确的坐标【英文标题】:Getting Accurate Coordinates when App Brought to Foreground 【发布时间】:2013-08-02 07:36:54 【问题描述】:我需要我的应用在从后台移到前台时显示非常准确的经纬度坐标。
我在执行此操作时遇到了很多麻烦。当我将我的应用程序置于后台时,位置服务会关闭。我曾考虑启用后台定位模式,但我知道这样做可能会导致用户的电池耗尽。我也尝试过使用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;
【问题讨论】:
您是否尝试从应用代理调用位置服务? 是的,位置服务是在应用委托中设置的。我将更新我的问题以显示我在做什么。 您的代码重复。从应用委托返回位置对象,让视图控制器处理格式。 【参考方案1】:在按钮单击时更新您的位置管理器。您需要等到它提供准确的位置。
检查这个 How to wait for until location Manager to get high accurate data
【讨论】:
【参考方案2】:在startUpdatingLocation
的文档中说:
连续多次调用此方法不会自动生成新事件。但是,在这两者之间调用 stopUpdatingLocation 确实会导致在您下次调用此方法时发送一个新的初始事件。
所以我建议“重新初始化”位置管理器
[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];
使用委托回调locationManager:didUpdateLocations:
应在几秒钟后调用以更新坐标以显示给用户。
PS:如果您使用延迟位置更新,您必须确保致电disallowDeferredLocationUpdates
。
【讨论】:
【参考方案3】:我认为你使用了错误的方法。
如您所见,GPS 需要一定的时间才能获得定位位置,这是因为 GPS 的工作原理,您无法更改它。 GPS 可能需要一分钟才能获得精确的位置,因此在所有 ios 设备(以及现在市场上的所有智能手机)中,您已经辅助 GPS,它使用蜂窝无线电和 wi-fi 三角测量,以便几乎立即提供大致位置。实际上,CLLocationManager 使用指定desiredAccuracy
的能力来打开或关闭特定传感器,例如,如果您指定kCLLocationAccuracyKilometer
,则有一个很好的变化是GPS 永远不会打开,并且只使用蜂窝+ wifi (因为这样更快,更省电)
startMonitoringSignificantLocationChanges
顾名思义,仅用于用户位置的重大(宽/大)变化,并不能解决您的问题。请记住,作为用户,我不喜欢某个应用继续监视我的位置,即使我知道它不需要它:这可能是终止或卸载您的应用的原因。
也就是说,它认为你能做的最好的事情就是等待或告诉用户你向他展示了一个位置,但可能并不准确(以 RunKeeper 为例)。 iOS 中的很多事情都是异步发生的,而不是强迫你的应用设计,因为这些事情是瞬间发生的,拥抱这个异步世界。
如果根据设计您需要一个精确的位置,您可以禁用该按钮,并等到 CLLocationManger 的代表告诉 (locationManager:didUpdateLocations:
) 您已达到所需的精度(您可以通过查看 @987654325 @'s horizontalAccuracy
) 然后启用按钮。
一点注意:CLLocationManager缓存了最后的位置,所以在做任何逻辑之前一定要检查CLLocation的时间戳。
【讨论】:
以上是关于将应用程序带到前台时获取准确的坐标的主要内容,如果未能解决你的问题,请参考以下文章