我需要知道我的应用中是否接近保存的Geo-location
,其范围是从10 Meters
到500 Meters
开始。我使用了startMonitoringForSignificantLocationChange
,但我没有得到准确的结果。相反,使用startupdatinglocation
可以提供与7 meters
一样准确的结果。我计划每隔NSTimer
添加一个startupdatinglocation
来致电1 minute
。
还有其他解决方案吗?
答案 0 :(得分:2)
首先,请不要每分钟调用startUpdatingLocation。您将在其设备上终止用户的电池寿命。定位服务利用大量电池电力来运行。此外,在您致电startUpdatingLocation
后,它会一直运行,直到您拨打stopUpdatingLocation
。
您可以在CLLocationManager
上设置属性以根据需要进行配置。像...
@property(assign, nonatomic) CLLocationDistance distanceFilter
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy
distanceFilter
说明:在生成更新事件之前,设备必须水平移动的最小距离(以米为单位)。
desiredAccuracy
可以是以下之一:
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
根据CLLocationManager
对象的配置,设备将使用某些地理位置硬件与其他硬件。有时简单地使用细胞塔三角测量就足够了,这是获得半精确位置的最快方法。其他时候可能需要使用GPS,这会很快耗尽电池寿命,并且需要更长的时间来实现一个位置,但在大多数情况下更准确。
我建议启动NSTimer,但是将其用于与您计划的相反的方式。如果stopUpdatingLocation
无法获得足够准确的位置,请在合理的时间后将其用于CLLocationManager
。您不希望永远保持位置服务运行。将此计时器设置为30秒后,将确保在超时后关闭它。
此外,您还需要实现CLLocationManagerDelegate方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
在此方法中,您需要检查位置的timestamp
以确保它是最近的。您还需要检查位置的horizontalAccuracy
以确保其在所需的精度范围内。以下是如何执行此操作的示例...
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// Ensure we get a recent and accurate location
NSDate * locationTimestamp = [newLocation timestamp];
NSTimeInterval timeDifference = [locationTimestamp timeIntervalSinceNow];
double thirtyMins = (30 * 60 * -1);
BOOL locationTimestampIsCurrent = (timeDifference > thirtyMins);
BOOL isAccurateLocation = (newLocation.horizontalAccuracy <= 3000.00);
if (locationTimestampIsCurrent && isAccurateLocation) {
NSLog(@"Shutting down location services, we have a good locaton.");
[self stopListeningForLocation];
} else {
// Do nothing, let this method be called again with a new "newLocation" to check its validity.
}
}
从iOS 6开始,不推荐使用上述方法,而是使用以下委托方法:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
要获取最新位置,只需获取位置数组的最后一个对象,如下所示:
CLLocation *location = [locations lastObject];
答案 1 :(得分:0)
你真的从头开始提出这些问题。我建议你关注Rob和Abhijit链接。您也可以从我在Github上的代码试验中受益: