싱글 톤 클래스를 사용하여 사용자 위치를 추적하고 있습니다. 내 실행중인 응용 프로그램 내에서 클래스를 인스턴스화하고 모든 추적을 시작하면 복숭아입니다.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];
}
배경 처리 스레드에서 CLLocationManager을 위임하지 못할 것 같다 그렇게 할 필요가 없어야합니다. 위치 관리자가 배경에 들어갔을 때 추적 중이라면 포 그라운드로 다시 들어올 때 자동으로 다시 시작됩니다. – matt
팁 주셔서 감사합니다. 나는 애플 리케이션 스위처에서 애플 리케이션이 닫혀 졌을 때, 더 이상 백그라운드 화되지 않았 음을 의미한다. – kosekmi
앱이 앱 전환기에서 * 죽은 경우 * 죽었습니다. 이 경우에는 콜드 스타트에서 시작됩니다. 따라서 이제는 "실행중인 앱에서 클래스를 인스턴스화하고 모든 정보가 복숭아로 추적되기 시작합니다."즉 두 경우 모두 조건이 동일해야합니다. 따라서 시작시 추적을 시작하는 코드와 "실행중인 앱 내에서"추적을 시작하는 코드에 대해 생각하고 보여줄 필요가 있습니다. 차이점이 무엇이든, 그것이 문제의 원인입니다. – matt