0

백그라운드에서 10 Meters부터 500 Meters까지 시작하는 범위 내에서 내 앱에 저장된 Geo-location에 가까이 있는지 알아야합니다. startMonitoringForSignificantLocationChange을 사용했지만 정확한 결과를 얻지 못하고 있습니다. 대신 startupdatinglocation을 사용하면 7 meters만큼 정확한 결과를 제공합니다. 을 추가하여 startupdatinglocation (1 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'을 호출 할 필요는 없습니다. 하지만 위치 서비스를 계속 유지할 수있는 권한을 요청해야합니다. [location discussion here] (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를 사용해야 할 수도 있습니다. GPS를 사용하면 배터리 수명이 매우 빨리 소모되고 장소를 확보하는 데 훨씬 오래 걸리지 만 대부분의 경우 훨씬 정확합니다.

나는 NSTimer를 시작하는 것이 좋지만 계획했던 것과는 정반대로 활용하는 것이 좋습니다. CLLocationManager이 충분히 정확한 위치를 얻을 수없는 경우 합리적인 시간이 지나면 stopUpdatingLocation으로 활용하십시오. 위치 서비스를 영원히 계속해서 실행하고 싶지는 않습니다. 이 타이머를 30 초와 같이 설정하면 제한 시간 후에 종료됩니다.

또한, 당신은 CLLocationManagerDelegate 메소드를 구현해야합니다

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

을 당신이 최근 확인하기 위해 위치의 timestamp을 확인해야합니다이 방법. 원하는 정확도 범위 내에 있는지 확인하려면 위치의 horizontalAccuracy도 확인해야합니다. 다음은이를 수행하는 방법의 예입니다.

: 단순히 때문에 같은 위치의 배열의 마지막 개체를 가져

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

가 새로운 위치를 얻으려면 : 위의 방법이 사용되지 않습니다 아이폰 OS 6에서

- (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. 
    } 
} 

대신 다음과 같은 위임 방법을 사용

CLLocation *location = [locations lastObject]; 
+0

안녕하세요. 답장을 보내 주셔서 감사합니다. :) . 나의 첫번째 질문은 사람이 3 개의 관심 지점을 추가했고 각각이 몇 미터의 거리에 걸쳐 변하는 것을 가정하면 어떻게 그 위치를 끌 수 있습니까? 이후 업데이 트를 중지합니다 .. 위치를 켜고 타이머를 사용하지만 30 초 후에 그것은 startUpdatingLocation을 다시 시작하는 방법을 끕니다? – droidiphonereef

+0

사용자 설정 5,10,20 ... 초에 따라 N 초마다 startUpdatingLocation을 실행하고 싶습니다. – droidiphonereef

+0

앱이 백그라운드에 있고 타이머 간격이 5 분 이상이라면이 방법을 시도해 봤습니까? –

0

정말 그 질문에 처음부터 시작하고 있습니다. 나는 Rob과 Abhijit 링크를 따라 가길 권합니다. 또한 Github에서 내 코드와 함께 실험 혜택을 누릴 수 있습니다 모든

TTLocationHandler Github