我需要我的应用程序在从背景到前景时显示非常准确的纬度和经度坐标。
我这样做有点麻烦。当我将我的应用程序放在后台时,位置服务将关闭。我考虑过启用后台定位模式,但我知道这样做可能会导致用户的电池耗尽。我也试图使用startMonitoringSignificantLocationChanges
,但这似乎不准确。
我的视图有一个按钮,可以在单击时显示用户的坐标。在四处走动时单击按钮时,坐标是准确的。但是,如果用户唤醒应用程序并立即单击按钮,则坐标就会消失。谁能帮我这个?启用后台位置模式是我唯一的选择吗?我可以禁用按钮,直到位置准确吗?任何帮助将不胜感激!
我的视图从我的app委托中设置的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;
}
答案 0 :(得分:1)
按钮点击更新您的位置管理员。您需要等到它提供准确的位置。
检查一下 How to wait for until location Manager to get high accurate data
答案 1 :(得分:0)
在startUpdatingLocation
的文档中,它说:
连续多次调用此方法不会自动导致生成新事件。但是,在两者之间调用stopUpdatingLocation会导致在下次调用此方法时发送新的初始事件。
所以我建议“重新初始化”位置管理器
[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];
使用委托回调locationManager:didUpdateLocations:
,该回调应在几秒钟后调用,以更新要显示给用户的坐标。
PS:如果您使用延期位置更新,则必须确保拨打disallowDeferredLocationUpdates
。
答案 2 :(得分:0)
我认为你的方法是错误的。
正如您所看到的,GPS 需要一段时间才能获得修复位置,这是因为GPS工作原理并且您无法更改它。 GPS可能需要一分钟才能获得精确的位置,出于这个原因,广告在所有iOS设备(以及现在市场上的所有智能手机)中,您已经协助GPS使用cellurar radio和wi-fi三角测量以便提供几乎即时的大致位置。实际上,CLLocationManager使用指定desiredAccuracy
的功能来打开或关闭特定传感器,例如,如果您指定kCLLocationAccuracyKilometer
,那么GPS从未打开且只有蜂窝状态有一个很好的变化+ wifi使用(因为这样更快,节省了大量电池)
startMonitoringSignificantLocationChanges
因为名称建议仅用于用户位置的重大(广泛/大)更改,并不能解决您的问题。请记住,当应用程序保持监控我的位置时,我不喜欢用户,即使我知道它不需要它:这可能是杀死或卸载应用程序的原因。
那说它认为你能做的最好的事情就是等待或者告诉用户你向他展示了一个位置但是可能不准确(例如看看RunKeeper)。 iOS中的很多东西是异步发生的,而不是强迫你的应用程序设计,因为这些事情瞬间发生,拥抱这个异步世界。
如果按照设计你需要一个精确的位置,你可以禁用按钮,等到CLLocationManger的代表告诉你(locationManager:didUpdateLocations:
)你已达到所需的准确度(你可以通过查看CLLocation
的{{1}}),然后启用按钮。
注意:CLLocationManager缓存最后的位置,因此在执行任何逻辑之前一定要检查CLLocation的时间戳。