저는 정기적으로 사용자 위치를 파악하는 응용 프로그램을 만들고 있습니다. 가장 큰 문제는 앱이 멈추거나 업데이트가 더 이상 제공되지 않는다는 것입니다. 비록 (죽이고 다시) 내 애플 리케이션을 다시 시작하더라도, 아무것도 바뀌지 않는다. (위치 관리자에 설정된 정확도 값은 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;
}
}
사람이 이런 일을 경험 했습니까? 모든 아이디어를 환영합니다 :) 감사! 당신이 다른 정확도 설정으로 두 개의 위치 매니저를 만드는 경우 내 경험에서
, 모두를위한 업데이트를 시작하고 만 업데이트를 중지
저는 해고 된 행동과 약간 혼동합니다. 왜 그걸하고 싶니? locationManager : (CLLocationManager *) manager \t didFailWithError : 오류가 발생하여 CLManager를 다시 시작하면 오류가 발생합니다 (NSError *). 그것은 주기적으로 상태를 확인하는 것보다 훨씬 좋은 방법입니다 (여러분의 방법과 같다고 생각합니다) – Yorxxx
나는 그 방법을 사용하지만 오류를 모니터링하는 용도로만 사용합니다. 타이머가 성공적으로 업데이트 된 후 시작되면 대기 플래그를 설정합니다. 업데이트 (예 : 3 초마다)없이 여러 번 실행될 수 있습니다.이 경우 위치 관리자를 시작할 필요가 없으며 플래그가 업데이트/위치 지정 중임을 나타냅니다. – Templar