我正在使用單例類來跟蹤用戶的位置。如果我從我正在運行的應用程序中實例化類並開始跟蹤一切都很好。但是,如果應用程序已關閉(在應用程序切換器中,所以它不再有後臺),並重新啓動,我檢查是否存在活動事件。在這種情況下,我實例化類並開始位置跟蹤。在locationManager
被實例化和位置箭頭出現在狀態,但在AppDelegate中使用CLLocationManager實例化Singleton類didFinishLaunchingWithOptions
-(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];
}
應該沒有必要這樣做。如果位置管理器在我們進入後臺時進行跟蹤,那麼當我們回到前臺時它會自動恢復。 – matt 2013-05-06 17:49:10
感謝您的提示。我的意思是當應用程序在應用程序切換器中關閉時,所以它不再是後臺 - 在問題中澄清了這一點。 – kosekmi 2013-05-06 19:50:48
如果應用程序在應用程序切換器中被*殺死*,它已經死亡。在這種情況下,它從冷啓動啓動。所以你現在應該「從運行的應用程序中實例化類,並開始跟蹤一切都很好」 - 換句話說,兩種情況下的條件完全相同。因此,您需要考慮(並顯示)啓動時開始跟蹤的代碼以及開始跟蹤的代碼「在我的正在運行的應用程序中」。不管有什麼不同,這都是麻煩的原因。 – matt 2013-05-06 20:48:27