0

我需要知道在我的应用程序中,在Geo-location的保存范围内,从10 Meters500 Meters的背景范围内。我已经使用startMonitoringForSignificantLocationChange但我没有得到准确的结果。相反使用startupdatinglocation给出的结果与7 meters一样准确。我打算增加一个NSTimer拨打startupdatinglocation1 minute我可以在后台使用startupdatinglocation吗?

有没有其他解决方案?

+3

请参阅[在后台获取位置事件](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009 497-CH2-SW10)。你不应该在后台调用'startUpdatingLocation'。但是您必须请求许可才能继续提供位置服务。请参阅[位置讨论](http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW24) – Rob

+0

http://stackoverflow.com/questions/6347503/how-do-i-get-a-background-location-update-every-n-minutes-in-my-ios-application –

回答

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,但将它用于您计划的相反。如果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]; 
+0

你好,谢谢你回复:) 。我的第一个问题是,假设一个人增加了3个兴趣点,并且每个人的距离在几米之间变化,我该如何关闭该位置?因为它会停止更新..使用计时器它会打开位置,但30秒后它会关闭如何重新启动startUpdatingLocation? – droidiphonereef

+0

我想根据用户设置5,10,20 ....秒每N秒运行一次startUpdatingLocation。 – droidiphonereef

+0

当应用程序处于后台并且定时器间隔超过5分钟时,是否尝试过这种方法? –

0

你真的从头开始讨论这些问题。我建议你关注Rob和Abhijit的链接。您还可以受益于在Github上我的代码实验:

所有的

TTLocationHandler Github

相关问题