Фоновая задача iOS (NSThread) умирает - PullRequest
3 голосов
/ 17 июля 2011

Несколько дней назад я отправил вопрос о NSThread.Наконец мне удалось каждую минуту запускать его в фоновом режиме.

Цель приложения - получить местоположение и затем вызывать веб-сервис для обновления его на сервере с ASIHTTPRequest каждые X минут.

Код:

- (void)threadEntryPoint:(ActualizarPosicionGPS2AppDelegate *)paramSender{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    while([[NSThread currentThread] isCancelled] == NO){
        [NSThread sleepForTimeInterval:60.0f];
        if ([[NSThread currentThread] isCancelled] == NO &&
            [[UIApplication sharedApplication] backgroundTimeRemaining] != DBL_MAX) {
            [self hacerCosasBackground];
        }
    }

    [pool release];
}

hacerCosasBackground вызывает LocationManager, обновляя свою позицию, а затем загружает позицию на сервер.

В приложении: didFinishLaunchingWithOptions:

[NSThread detachNewThreadSelector:@selector(threadEntryPoint:) toTarget:self withObject:self];


-(void) endTaskWidthIdentifier:(NSNumber *)paramIdentifier{
    UIBackgroundTaskIdentifier identifier = [paramIdentifier integerValue];
    [[UIApplication sharedApplication] endBackgroundTask:identifier];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
        NSNumber *backgroundTask = [NSNumber numberWithInteger:self.backgroundTaskIdentifier];
        [self performSelectorOnMainThread:@selector(endTaskWidthIdentifier:) withObject:backgroundTask waitUntilDone:YES];
        self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
    }];
}

Тем не менее, NSThread умирает примерно через 10 минут после закрытия приложения.Я зарегистрировался в info.plist в месте расположения UIBackgroundModes.Я также читал о startMonitoringSignificantLocationChanges, но я хочу сделать мое приложение очень настраиваемым (пользователь сможет установить, как часто они хотят обновлять местоположение и т. Д.), И я понял, что этот метод обновляется каждые 500 м (это не хорошо, яхотите чаще обновлять местоположение).

Что я могу сделать?Любая помощь, пожалуйста?

Большое спасибо!

...