2012-02-16 3 views
1

저는 정기적으로 사용자 위치를 파악하는 응용 프로그램을 만들고 있습니다. 가장 큰 문제는 앱이 멈추거나 업데이트가 더 이상 제공되지 않는다는 것입니다. 비록 (죽이고 다시) 내 애플 리케이션을 다시 시작하더라도, 아무것도 바뀌지 않는다. (위치 관리자에 설정된 정확도 값은 100 ~ 200 미터에 가깝습니다.) 하지만 Google지도 앱을 시작하면 몇 초 만에 매우 정확한 위치가됩니다 (다시 전환하면 내 앱에 전달됩니다) . 왜 ? 다음은 관련 코드 부분입니다.CLLocationManager가 가끔 붙어 있습니다.

timerFiredAction은 타이머에 의해 주기적으로 호출됩니다.

-(void) timerFiredAction 
{ 
    if (isStillWaitingForUpdate) 
    { 
     successiveTimerActivationCount ++; 
     // force LM restart if value too big , e.g. 30 (stop + start) 
     return; 
    } 
    successiveTimerActivationCount = 0 ; 
    isStillWaitingForUpdate = YES; 
    /* isRecordingX is always true */ 
    if (isSignificant && isRecordingSig) [self startSignificant ]; 
    if (isGPS && isRecordingGPS) [self startGps]; 
} 

// this is called in delegate method only 
-(void) timerStopLocationServices 
{ 
    isStillWaitingForUpdate = NO; 
    if (isGPS) [ self stopGps] ; 
    if (isSignificant) [self stopSignificant]; 
} 


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    // verify accuracy and stuff 
    if (isStillWaitingForUpdate && _other_validations_) 
    { 
    // store it 
    [self timerStopLocationServices] ; 

    } 

} 

시작하고을 locationManager이 전무 경우 예 그들은 createManager를 호출하고 & stopUpdatingLocation을 시작 호출하는 경우, 단순히 verifiy 방법을 중지합니다.

LM의 생성은 다음과 같습니다

-(void)createManager 
{ 
    @synchronized (self) 
    { 
    if (locationManager != nil) { 
     [self releaseManager]; // stop timer, stop updating , reelase previous if exists 
    } 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    double desired; 
    // accuracy is an init param, snap to one smaller constant 
    // generally 100-200 
    if (accuracy >= kCLLocationAccuracyThreeKilometers) desired = kCLLocationAccuracyThreeKilometers; else 
    if (accuracy >= kCLLocationAccuracyKilometer)   desired = kCLLocationAccuracyKilometer; else 
    if (accuracy >= kCLLocationAccuracyHundredMeters)  desired = kCLLocationAccuracyHundredMeters; else 
    if (accuracy >= kCLLocationAccuracyNearestTenMeters) desired = kCLLocationAccuracyNearestTenMeters; else 
    if (accuracy >= kCLLocationAccuracyBest)    desired = kCLLocationAccuracyBest; else   
    if (accuracy >= kCLLocationAccuracyBestForNavigation) desired = kCLLocationAccuracyBestForNavigation; 

    locationManager.desiredAccuracy = desired; 
    locationManager.distanceFilter = distanceFilter; 
    } 
} 

사람이 이런 일을 경험 했습니까? 모든 아이디어를 환영합니다 :) 감사! 당신이 다른 정확도 설정으로 두 개의 위치 매니저를 만드는 경우 내 경험에서

, 모두를위한 업데이트를 시작하고 만 업데이트를 중지

+0

저는 해고 된 행동과 약간 혼동합니다. 왜 그걸하고 싶니? locationManager : (CLLocationManager *) manager \t didFailWithError : 오류가 발생하여 CLManager를 다시 시작하면 오류가 발생합니다 (NSError *). 그것은 주기적으로 상태를 확인하는 것보다 훨씬 좋은 방법입니다 (여러분의 방법과 같다고 생각합니다) – Yorxxx

+0

나는 그 방법을 사용하지만 오류를 모니터링하는 용도로만 사용합니다. 타이머가 성공적으로 업데이트 된 후 시작되면 대기 플래그를 설정합니다. 업데이트 (예 : 3 초마다)없이 여러 번 실행될 수 있습니다.이 경우 위치 관리자를 시작할 필요가 없으며 플래그가 업데이트/위치 지정 중임을 나타냅니다. – Templar

답변

0

나는 약간 다른 맥락에서하지만 적어도, "차단 된 위치 관리자"를 확인하실 수 있습니다 더 높은 정확도 요구 사항이있는 경우, 다른 하나는 더 이상 갱신 사항을 수신하지 않습니다.

분명히 한 명의 관리자 만 사용하고 있지만 관리자가 멈추는 방식은 같습니다. 위에서 설명한 경우지도 응용 프로그램 (또는 이와 유사한 도구)을 사용하여 업데이트를 다시 시작할 수도 있습니다.

내 해결 방법은 다음과 내가 하나의 관리자를 중지 할 때마다, 나는 또한처럼 (myCLLocationManagers를라는 NSSet에 저장) 모든 다른 사람의 거리 필터를 다시 다음

CLLocationManager * lm; 
    CLLocationDistance tmp; 
    for (lm in myCLLocationManagers){ 
     tmp=lm.distanceFilter; 
     lm.distanceFilter=kCLDistanceFilterNone; 
     lm.distanceFilter=tmp; 
    } 

이 더 작동하는 것 같다 (관리자를 중지하고 다시 시작하는 것)보다 훨씬 안정적이었습니다.

kCLLocationAccuracyBestForNavigationkCLLocationAccuracyBest은 (현재) 음의 값, 그리고 그 일반적으로, 당신은 모든 상수의 특정 값에 의존해서는 안 - 보장이 없다는 것을 kCLLocationAccuracyHundredMeters==100 (사실 현재 비록). 나는 당신이 미터에서 "정확도"변수를 그 상수와 직접 비교하는 것처럼 보이기 때문에 이것을 언급합니다.

+0

처음에는 GPS 용과 시그 ​​(Sig) 용 관리자가 두 명 있었으므로 이것이 문제의 원인이라고 생각했지만 그렇지 않았습니다. 이 코드는 하나의 인스턴스에서만 작동합니다. – Templar

+0

강제 방법 (중지 및 시작)은 때로는 도움이되기도하고 때로는 이상합니다.정확도와 관련하여, 나는 그것이 부정적인 것이고, 나는 직접적으로 비교해서는 안되지만, 양의 정확도에 대해서는 비교할 만하다 (내 경우에는 ~ 100-200). 어쨌든 위치를 인쇄 한 후에 위임자의 정확성을 확인하지만 앱이 멈추었을 때 위임자는 전혀 호출되지 않습니다. – Templar

관련 문제