2015-12-30 2 views
1

Я пытаюсь отслеживать местоположение, используя locationManager в фоновом режиме каждый «промежуток времени», когда приложение находится в фоновом режиме.Периодическое расположение в фоновом режиме в iOS9

Работает отлично на iOS 8 iPhone 6 - но я продолжаю заканчивать через 2,5 - 3 минуты, iOS в iOS 9 iPhone 6s.

Мой главный вопрос - в чем разница между iPhone 6 iOS 8 и 6s iOS 9? лучший сторожевой таймер для фоновых задач? если да, то как я могу это решить?

Я сеял решения, которые включают снижение точности, чтобы сократить время автономной работы, а не временные интервалы. Я не хочу этого, потому что пользователь все время видит индикацию контроля местоположения (полная стрелка).

часть моего кода -

-(void)initialize 
{ 
    self.locationManager = [[CLLocationManager alloc]init]; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    self.locationManager.distanceFilter = 5; 
    self.locationManager.delegate = self; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(addMonitorsBeforeWillTerminate) 
               name:UIApplicationWillTerminateNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { 
     [[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:nil]; 
    }]; 
     [self.locationManager startUpdatingLocation]; 
    } 

благодаря

+1

Найти мой ответ здесь, это может быть полезно , http://stackoverflow.com/questions/34512007/periodic-sending-small-data-to-server-in-background-mode/34512750#34512750 – technerd

+0

Вы спасли мне жизнь, спасибо! – ozd

ответ

0

Для Однако бороться с этим в будущем, ответ пришел из «technerd» комментарием, так что я включил его в к ответу -

https://github.com/voyage11/Location

0
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 


if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){ 


    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 

} 

больше глубины и широты информации можно найти в следующей link.

+1

, что не сработало для меня – ozd

0

Два варианта, которые я рекомендую.

  1. Когда в фоновом режиме переключитесь на kCLLocationAccuracyThreeKilometers. Это отключит GPS и не разрядит батарею, потому что она будет использовать только информацию о ячейке. Запросите разрешение для служб определения местоположения и создайте обратный вызов NSTimer (это будет поддерживать ваше приложение в BG). Внутри переключателя обратного вызова до нужной точности сделайте обновление местоположения, затем снова вернитесь к низкой точности.
  2. Подпишитесь на важные изменения местоположения. С этим, однако, ваше приложение не будет уведомляться каждые X минут.
+0

kCLLocationAccuracyThreeKilometers сохраняет полную стрелу, которую я хочу избежать. вы могли сделать это без стрелки? также, что вы имеете в виду «NSTimer callback» - [NSTimer scheduleTimerWithTimeInterval: 15 target: self selector: @selector (timerFired) userInfo: nil repeatats: NO]; - или что-то другое? – ozd

+0

Он будет хранить всю стрелку, потому что она запускает службы определения местоположения. Что касается NSTimer, это именно то, что я имел в виду. Но запуск его каждые 15 секунд не имеет особого смысла в моей методологии. – Teddy

Смежные вопросы