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

У меня есть таймер, который показывает NSTime тренировки пользователя. Диспетчер местоположения и этот таймер перестают обновляться, когда мое приложение переходит в фоновый режим. Как я могу заставить их обновляться, когда мое приложение находится в фоновом режиме?

У меня есть представление под названием RunViewController с кнопкой запуска. Когда пользователь нажимает эту кнопку, запускается таймер и диспетчер местоположения. Код:

 -(void)startRun{
    timeSec = 0;
    timeMin = 0;
    timeHour = 0;

    NSString* timeNow = [NSString stringWithFormat:@"%02d:%02d:%02d",timeHour , timeMin, timeSec];
    //Display on your label
    lblTime.text = timeNow;

    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    self.locManager = [[CLLocationManager alloc] init];
    locManager.delegate = self;
    locManager.desiredAccuracy = kCLLocationAccuracyBest; //kCLLocationAccuracyBest
    [locManager setDistanceFilter:3]; //kCLDistanceFilterNone

    [locManager startUpdatingLocation];
    locationManagerStartDate = [[NSDate date] retain];


}

In - (void) locationManager: (CLLocationManager *) менеджер didUpdateToLocation: (CLLocation *) newLocation fromLocation: (CLLocation *) oldLocation

просто рисует линию на карте от старого местоположения к новому и сохраняет это местоположение в массиве.

Заранее спасибо.


person Piscean    schedule 16.01.2012    source источник
comment
опубликуйте свой код. также опубликовать код диспетчера обновления местоположения   -  person Hiren    schedule 16.01.2012


Ответы (2)


Нашел решение реализовать это с помощью форумов разработчиков Apple. Я сделал следующее:

  • Укажите фоновый режим местоположения

  • Используйте NSTimer в фоновом режиме, используя

  • UIApplication: beginBackgroundTaskWithExpirationHandler: если n равно

меньше, чем UIApplication: backgroundTimeRemaining, он работает нормально, в случае, если n больше, диспетчер местоположения должен быть включен (и отключен) снова, прежде чем не останется времени, чтобы избежать прерывания фоновой задачи. Это действительно работает, поскольку местоположение является одним из трех разрешенных типов фонового выполнения.

Примечание: потерял некоторое время, тестируя это в симуляторе, где он не работает, отлично работает на моем телефоне.

Здесь - это ссылка на то же самое.

person UPT    schedule 16.01.2012

Попробуй это..

-(void)viewDidLoad
{
    UIDevice* device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;
    if ([device respondsToSelector:@selector(isMultitaskingSupported)])
        backgroundSupported = device.multitaskingSupported;

    NSLog(backgroundSupported ? @"Yes" : @"No");


    counterTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
     //called after 10min of your app in background
        NSLog(@"10 minutes finished.");
    }];

    theTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(selectorForUpdatingLocation) userInfo:nil repeats:YES];

}
person Heena    schedule 16.01.2012