我可以在后台使用startupdatinglocation吗?

时间:2013-05-20 13:19:02

标签: ios iphone core-location cllocationmanager background-fetch

我需要知道我的应用中是否接近保存的Geo-location,其范围是从10 Meters500 Meters开始。我使用了startMonitoringForSignificantLocationChange,但我没有得到准确的结果。相反,使用startupdatinglocation可以提供与7 meters一样准确的结果。我计划每隔NSTimer添加一个startupdatinglocation来致电1 minute

还有其他解决方案吗?

2 个答案:

答案 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上的代码试验中受益:

TTLocationHandler Github