получение обновлений местоположения после закрытия приложения

Мне нужно постоянно отслеживать местоположение пользователя (но не разряжать батарею). Я понимаю, что единственный способ получать обновления после закрытия приложения — использовать startMonitoringSignificantLocationChanges.

Из Руководства Apple по программированию определения местоположения на странице startMonitoringSignificantLocationChanges:

Если вы запускаете эту службу и ваше приложение впоследствии завершается, система автоматически перезапускает приложение в фон, если приходит новое событие.В таком случае варианты словарь, переданный приложению: didFinishLaunchingWithOptions: метод вашего делегата приложения содержит ключ UIApplicationLaunchOptionsLocationKey, чтобы указать, что ваш приложение было запущено из-за события местоположения. После перезапуска вы все равно должны настроить объект диспетчера местоположения и вызвать его метод для продолжения получения событий местоположения. Когда вы перезапустите услуги определения местоположения, текущее событие доставляется вашему делегату немедленно. Кроме того, свойство местоположения вашего местоположения объект менеджера заполняется самым последним объектом местоположения, даже перед запуском служб определения местоположения.

Я был бы рад, если бы кто-нибудь мог продемонстрировать в коде (привести пример), какие методы я должен использовать

В следующем коде я пытаюсь: - Запустите менеджер местоположений в appdelegate, который управляет обновлениями и датами запуска. - в didUpdateToLocation я останавливаю обновление - в didFinishLaunchingWithOptions, когда я проверяю, получил ли я UIApplicationLaunchOptionsLocationKey, чтобы узнать, нахожусь ли я в фоновом режиме и запущен ли из-за значительного обновления местоположения монитора. - если это так, я снова вызываю startMonitoringSignificantLocationChanges (не знаю, почему...) и запустите UIBackgeoundTaskIdentifier для вызова метода startupdating.

LocationController.m : 
+ (LocationController*)sharedInstance {
    @synchronized(self) {
        if (sharedCLDelegate == nil) {
            [[self alloc] init];
        }
    }
    return sharedCLDelegate;
}

- (id)init
{
    self = [super init];
    if (self != nil) {
        self.locationManager = [[[CLLocationManager alloc] init] autorelease];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
        [self.locationManager startUpdatingLocation];
        [self.locationManager startMonitoringSignificantLocationChanges];

    }
    return self;
}
- (void) startMonitoringSignificantLocationChanges
{
    [self.locationManager startMonitoringSignificantLocationChanges];
}
- (void) stopMonitoringSignificantLocationChanges
{
    [self.locationManager stopMonitoringSignificantLocationChanges];
}
-(void) start{
    [self.locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation{
    if ( abs([newLocation.timestamp timeIntervalSinceDate: [NSDate date]]) < 30) {
        self.lastLocation = newLocation;
        [self updateLocation]; //sending location to server
        [self.locationManager stopUpdatingLocation];
    }
}
- (void)locationManager:(CLLocationManager*)manager
       didFailWithError:(NSError*)error{
    [self.locationManager stopUpdatingLocation];
}

AppDelegate.h : 

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIBackgroundTaskIdentifier bgTask;
}

AppDelegate.m : 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
        id locationValue = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey];
        if (locationValue) {
            [[LocationController sharedInstance] startMonitoringSignificantLocationChanges];
            UIApplication *app  = [UIApplication sharedApplication];
            bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
                [app endBackgroundTask:bgTask]; 
                bgTask = UIBackgroundTaskInvalid;
            }];
            [[LocationController sharedInstance] start]; //startupdating
            return YES;
        }
    else { 
            [[LocationController sharedInstance] init];
    }
}
-(void) applicationDidEnterBackground:(UIApplication *) application
{
    NSLog(@"entered background Mode");
}

-(void) applicationDidBecomeActive:(UIApplication *) application
{
    NSLog(@"application Did Become Active");
}

Спасибо.

5
задан Myxtic 11 December 2014 в 17:10
поделиться