2013-09-30 2 views
1

Я создал базу GPS-приложений.NSTimer останавливается в фоновом режиме при отсоединении кабеля питания

В каком приложении регистрируются данные GPS каждые 1 секунду. Приложение использовало NSTimer для сбора данных GPS каждую секунду. Этот NSTimer запускается в фоновом режиме. NSTimer запускается, когда приложение получает сообщение push-push от APNS. Я видел проблему в iOS 7, что когда телефон подключен с помощью кабеля питания в тот момент, когда таймер звонит надлежащим образом, но без подключенного таймера кабеля питания останавливается, когда приложение находится в фоновом режиме.

Любые материалы для решения этой проблемы очень ценятся.

+0

Вы читали об управлении фоновой информацией в iOS 7 (и почему вы молча записываете данные о местоположении?) – Wain

+0

NSTimer работает именно так. Он останавливается, когда приложение находится в фоновом режиме. – dmitri

ответ

4

Не гарантируется пожар, если ваше приложение не находится на переднем плане. Как только вы отключите кабель, система помещает ваше приложение в фон, чтобы сэкономить аккумулятор.

Использование NSTimer не поддерживается методом получения данных о местоположении. Ваш CLLocationManager расскажет своему делегату, когда появится новое место. Не нужно опросить его.

Если вам нужно отслеживать геолокацию в фоновом режиме, вам необходимо объявить обновления местоположения в качестве фонового режима на вкладке возможностей в целевых настройках Xcode 5. В противном случае ваш менеджер местоположений прекратит доставку обновлений местоположения, если ваше приложение не находится на переднем плане.

0

Существует только несколько вариантов использования, которые вы можете реализовать на переднем плане. Если вы не хотите, чтобы ваше заявление было отклонено в ходе проверки, не используйте хаки. Конечно, вы можете использовать NSTimer в фоновом режиме, но он должен быть создан в потоке (runloop) фоновой задачи. Но эта фоновая задача живет только на определенное количество времени, поэтому ваш таймер должен срабатывать в течение этого периода. Другими словами, ваша первая цель - создать фоновое задание, и только тогда вы можете использовать таймер. Есть несколько случаев, подходящих для вашей цели (которые позволяют вам создать эту задачу): 1.Монитор значительных изменений местоположения или региона. 2. Извлечь данные (iOs 7). Поэтому, пожалуйста, обратитесь к

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
    NSLog(@"BG fetch in action"); 
    //the only 30 sec is allowed to perform all your actions 
    //during this period you can each second track GPS data 
     [self performSelector:@selector(finishBackgroundFetch:) withObject:completionHandler afterDelay:27]; 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"StartMyGPSRoutine" object:nil]; 
    } 

    -(void)finishBackgroundFetch:(void (^)(UIBackgroundFetchResult))completionHandler { 
     NSLog(@"BG fetch completion handler"); 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"ForceStopAnyBackgroundTaskCreatedWithStartMyGPSRoutine" object:nil]; 
     completionHandler(UIBackgroundFetchResultNewData); 
    } 

делегата приложения - это будет полезно в вашем случае, а также будет отслеживать значительные изменения местоположения. Вы должны поставить в любом месте:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(setMinimumBackgroundFetchInterval:)]) { 
      NSLog(@"Set Force BG interval to %ld", interval); 
      [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:interval]; 
} 

В моем случае я получать данные GPS каждые 5 мин так 27sec, чтобы выполнить эту задачу не так долго. В любом случае вы можете играть с временными интервалами с помощью XCode. Пожалуйста, см. Главное меню-> Отладка-> Имитировать фоновый выбор

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