我需要知道我的应用程序中保存的Geo-location是否在从10 Meters到500 Meters in background的范围内。我已经使用了startMonitoringForSignificantLocationChange,但是我没有得到准确的结果。相反,使用startupdatinglocation给出的结果与7 meters一样准确。我计划添加一个NSTimer来调用每个1 minute的startupdatinglocation。
有没有其他的解决方案?
发布于 2013-05-21 10:12:41
首先,请不要每分钟都给startUpdatingLocation打电话。你会在用户的设备上扼杀他们的电池寿命。定位服务使用大量的电池电量来运行。此外,一旦调用startUpdatingLocation,它将一直运行到您调用stopUpdatingLocation为止。
您可以在CLLocationManager上设置一些属性,以根据需要对其进行配置。比如..。
@property(assign, nonatomic) CLLocationDistance distanceFilter
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracydistanceFilter描述:在生成更新事件之前,设备必须水平移动的最小距离(以米为单位)。
desiredAccuracy可以是以下类型之一:
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;根据CLLocationManager对象的配置,设备将使用某些地理位置硬件而不是其他硬件。有时,简单地使用手机发射塔三角测量就足够了,这是获得半准确位置的最快方法。其他时候,它可能需要利用GPS,这将非常快地耗尽电池寿命,并需要更长的时间来实现定位,但在大多数情况下更准确。
我会建议开始一个NSTimer,但使用它与您的计划相反。如果CLLocationManager无法获得足够准确的位置,请在一段合理的时间后将其用于stopUpdatingLocation。您不想让位置服务永远运行。将此计时器设置为大约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];发布于 2013-05-21 09:24:33
你真的是从头开始回答这些问题。我建议你关注Rob和Abhijit的链接。你也可以在Github上试验我的代码:
https://stackoverflow.com/questions/16650462
复制相似问题