2013-05-06 6 views
0

싱글 톤 클래스를 사용하여 사용자 위치를 추적하고 있습니다. 내 실행중인 응용 프로그램 내에서 클래스를 인스턴스화하고 모든 추적을 시작하면 복숭아입니다.AppDelegate에서 CLLocationManager를 사용하여 Singleton 클래스 인스턴스화하기 didFinishLaunchingWithOptions

그러나 앱을 닫으면 (앱 스위처에서 더 이상 배경이 표시되지 않음) 다시 시작되어 활성 이벤트가 있는지 확인합니다. 이 경우 클래스를 인스턴스화하고 위치 추적을 시작합니다. locationManager 인스턴스화됩니다 및 위치 화살표가 상태 표시 줄에 나타납니다,하지만

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
or 
    -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
never get called 

어떤 생각?

는 는

코드 singelton 클래스 : AppDelegate에에서

@interface AlarmMeTrackUserLocation() <CLLocationManagerDelegate> 
@property (strong, nonatomic) CLLocationManager *locationManager; 
@end 

@implementation AlarmMeTrackUserLocation  
-(void)toggleLocationUpdates:(bool)toggle { 

    if (!toggle) { 
     [self.locationManager stopUpdatingLocation]; 
     self.locationManager = nil; 
     sharedInstance = nil; 
     NSLog(@"--- UserTrack Stopped ---"); 
     return; 
    } 


    if (!self.locationManager && toggle) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
     self.locationManager.pausesLocationUpdatesAutomatically = YES; 
     self.locationManager.distanceFilter = 200; 
    } 

    NSLog(@"--- UserTrack Started"); 
    [self.locationManager startUpdatingLocation]; 

} 

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

- (void)locationManager:(CLLocationManager *)manager 
    didFailWithError:(NSError *)error { 
    ... 
} 

+ (AlarmMeTrackUserLocation *)sharedTrackUserLocation { 

    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 

     //NSLog(@"--- New Instance created ---"); 

     return sharedInstance; 
    } 

    NSLog(@"--- Existing Instance Used ---"); 

    return sharedInstance; 
} 

코드 :

@property (strong, nonatomic) AlarmMeTrackUserLocation *userTrack; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    ... 
    self.userTrack = [AlarmMeTrackUserLocation sharedTrackUserLocation]; 
    self.userTrack.event = currentEvent; 
    [self.userTrack toggleLocationUpdates:YES]; 

} 
+0

배경 처리 스레드에서 CLLocationManager을 위임하지 못할 것 같다 그렇게 할 필요가 없어야합니다. 위치 관리자가 배경에 들어갔을 때 추적 중이라면 포 그라운드로 다시 들어올 때 자동으로 다시 시작됩니다. – matt

+0

팁 주셔서 감사합니다. 나는 애플 리케이션 스위처에서 애플 리케이션이 닫혀 졌을 때, 더 이상 백그라운드 화되지 않았 음을 의미한다. – kosekmi

+1

앱이 앱 전환기에서 * 죽은 경우 * 죽었습니다. 이 경우에는 콜드 스타트에서 시작됩니다. 따라서 이제는 "실행중인 앱에서 클래스를 인스턴스화하고 모든 정보가 복숭아로 추적되기 시작합니다."즉 두 경우 모두 조건이 동일해야합니다. 따라서 시작시 추적을 시작하는 코드와 "실행중인 앱 내에서"추적을 시작하는 코드에 대해 생각하고 보여줄 필요가 있습니다. 차이점이 무엇이든, 그것이 문제의 원인입니다. – matt

답변

0

조심스럽게 내 코드를 검토 한 후 내가 하나 개의 차이를 볼 수는 : 응용 프로그램의 위임에 내가 데이터를 가져올 수있는 배경 처리 스레드를 시작합니다 웹 서버에서. 요청이 완료되면 싱글 톤 클래스가 인스턴스화되고 locationManager가 설정됩니다 (여전히 백그라운드 스레드에 있음).

주 스레드로 다시 전환하고 최종 작업을 인스턴스화 한 후!

는 그래서 "응용 프로그램이 닫히고 난 활성 이벤트가 있는지 확인 다시 시작한 경우, 그러나"당신이

+1

주 스레드에서 코드 블록을 얻은 방법에 대한 샘플 코드를 추가 할 수 있습니까? 웹 서비스 응답에 dispatch_async를 사용 했습니까? –

+0

방금 ​​전에 귀하의 의견을 보았습니다. 늦어서 반갑습니다. 이 스레드는 '13에서 유감스럽게도 더 이상 코드가 없습니다. – kosekmi

관련 문제