запускать приложение непрерывно в фоновом режиме - PullRequest
6 голосов
/ 16 октября 2010

Я хочу, чтобы мое приложение продолжало работать в фоновом режиме со службами определения местоположения. Для этого я использовал:

-(void)applicationDidEnterBackground:(UIApplication *)application {

    [locationManager stopUpdatingLocation];
    [locationManager startUpdatingLocation];

    //timer=[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(UpdateLocation) userInfo:nil repeats:YES];

}

но когда я использую NSTimer, он не вызывает UpdateLocation. Я попытался вызвать его, используя другой метод, но затем он также вызвал только один раз.

Я хочу непрерывно запускать приложение в фоновом режиме, обнаруживая местоположения через определенный промежуток времени.

Ответы [ 3 ]

5 голосов
/ 23 июня 2011

Я сделал это в разрабатываемом приложении.Таймеры не работают, когда приложение находится в фоновом режиме, но приложение постоянно получает обновления местоположения.Я прочитал где-то в документации (я не могу найти его сейчас, я опубликую обновление, когда я это сделаю), что метод может быть вызван только в активном цикле выполнения, когда приложение находится в фоновом режиме.У делегата приложения есть активный цикл выполнения даже в bg, поэтому вам не нужно создавать свой собственный, чтобы это работало.[Я не уверен, что это правильное объяснение, но вот как я понял из того, что я прочитал]

Прежде всего, добавьте объект 'location' для ключа 'Background Modes' в info.plist вашего приложения.Теперь вам нужно запустить обновления местоположения в любом месте вашего приложения:

CLLocationManager locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;//or whatever class you have for managing location

[locationManager startUpdatingLocation];

Затем напишите метод обработки обновлений местоположения, скажем - (void) didUpdateToLocation: (CLLocation *) location,в приложении делегат.Затем реализуйте метод locationManager: didUpdateLocation: fromLocation класса CLLocationManagerDelegate в классе, в котором вы запустили диспетчер расположений (поскольку мы установили делегат менеджера расположений в 'self').В этом методе вы должны проверить, истек ли временной интервал, после которого вы должны обрабатывать обновления местоположения.Вы можете сделать это, сохраняя текущее время каждый раз.Если это время истекло, вызовите метод UpdateLocation из вашего делегата приложения:

NSDate *newLocationTimestamp = newLocation.timestamp;
NSDate *lastLocationUpdateTiemstamp;

int locationUpdateInterval = 300;//5 mins

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if (userDefaults) {

        lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp];

        if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) {
            //NSLog(@"New Location: %@", newLocation);
            [(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation];
            [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp];
        }
    }
}

Это будет вызывать ваш метод каждые 5 минут, даже если ваше приложение находится в фоновом режиме.Imp: Эта реализация разряжает батарею, если точность данных о вашем местоположении не критична, вы должны использовать [locationManager startMonitoringSignificantLocationChanges]

Перед добавлением этого в ваше приложение, пожалуйста, прочитайте Руководство по программированию осведомленности о местоположении на http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html

0 голосов
/ 29 апреля 2013

Вы можете использовать для запуска приложения в фоновом режиме для конкретной задачи.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];
    UIBackgroundTaskIdentifier bgTask = 0;

    backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}
0 голосов
/ 20 декабря 2012

Я знаю, что очень поздно для ответа. Но если вы до сих пор не получили ответа, вот что я сделал, и мое приложение постоянно работает в фоновом режиме.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
     UIApplication *app = [UIApplication sharedApplication];
     UIBackgroundTaskIdentifier bgTask = 0;

     backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self  selector:@selector(backgroundTask) userInfo:nil repeats:YES];

     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];
}

Теперь делайте что хотите в методе backgroundTask .

...