首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在后台使用startupdatinglocation吗?

我可以在后台使用startupdatinglocation吗?
EN

Stack Overflow用户
提问于 2013-05-20 21:19:02
回答 2查看 3K关注 0票数 0

我需要知道我的应用程序中保存的Geo-location是否在从10 Meters500 Meters in background的范围内。我已经使用了startMonitoringForSignificantLocationChange,但是我没有得到准确的结果。相反,使用startupdatinglocation给出的结果与7 meters一样准确。我计划添加一个NSTimer来调用每个1 minutestartupdatinglocation

有没有其他的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-21 10:12:41

首先,请不要每分钟都给startUpdatingLocation打电话。你会在用户的设备上扼杀他们的电池寿命。定位服务使用大量的电池电量来运行。此外,一旦调用startUpdatingLocation,它将一直运行到您调用stopUpdatingLocation为止。

您可以在CLLocationManager上设置一些属性,以根据需要对其进行配置。比如..。

代码语言:javascript
复制
@property(assign, nonatomic) CLLocationDistance distanceFilter
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy

distanceFilter描述:在生成更新事件之前,设备必须水平移动的最小距离(以米为单位)。

desiredAccuracy可以是以下类型之一:

代码语言:javascript
复制
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;

根据CLLocationManager对象的配置,设备将使用某些地理位置硬件而不是其他硬件。有时,简单地使用手机发射塔三角测量就足够了,这是获得半准确位置的最快方法。其他时候,它可能需要利用GPS,这将非常快地耗尽电池寿命,并需要更长的时间来实现定位,但在大多数情况下更准确。

我会建议开始一个NSTimer,但使用它与您的计划相反。如果CLLocationManager无法获得足够准确的位置,请在一段合理的时间后将其用于stopUpdatingLocation。您不想让位置服务永远运行。将此计时器设置为大约30秒将确保它在超时后关闭。

此外,您还需要实现CLLocationManagerDelegate方法:

代码语言:javascript
复制
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

在这种方法中,您需要检查位置的timestamp,以确保它是最新的。您还需要检查位置的horizontalAccuracy,以确保它在所需的精度范围内。这里有一个如何做到这一点的例子。

代码语言:javascript
复制
- (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开始,上述方法已弃用,请改用以下委托方法:

代码语言:javascript
复制
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

要获取最新的位置,只需获取位置数组的最后一个对象,如下所示:

代码语言:javascript
复制
  CLLocation *location = [locations lastObject];
票数 2
EN

Stack Overflow用户

发布于 2013-05-21 09:24:33

你真的是从头开始回答这些问题。我建议你关注Rob和Abhijit的链接。你也可以在Github上试验我的代码:

TTLocationHandler Github

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16650462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档