Проблема при работе в фоновом режиме и Nstimer?

Привет, у меня есть задача разработать приложение с помощью Nstimer и фонового процесса.

Я уже реализовал фоновый процесс с таймером. И это работает хорошо. Но у меня проблема, когда я сворачиваю приложение в первый раз, в то время как фоновый процесс не запущен. после сворачивания приложения 3-4 раза. После этого работает ровно. я также отображаю код фоновой задачи и таймера следующим образом.

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

    UIApplication*    app = [UIApplication sharedApplication];
    NSLog(@"Application enter in background");
    [NSTimer scheduledTimerWithTimeInterval:2.0f
                                     target:self
                                   selector:@selector(updateCounter:)
                                   userInfo:nil
                                    repeats:YES]; 
}

И мой метод updateCounter выглядит следующим образом:

    - (void)updateCounter:(NSTimer*)timer {

    NSString *id = [[UIDevice currentDevice] uniqueIdentifier];
    NSLog(@"uniqueid:%@",id);

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];

    CLLocation *location = [locationManager location];

    // Configure the new event with information from the location
    CLLocationCoordinate2D coordinate = [location coordinate];

    NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude]; 
    NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];

    NSLog(@"dLatitude : %@", latitude); 
    NSLog(@"dLongitude : %@",longitude);

}

Есть ли у них код, связанный с какой-либо проблемой. Пожалуйста, помогите мне решить эту проблему.


person Hrushikesh Betai    schedule 25.08.2011    source источник
comment
Таймеры не работают в фоновом режиме. Я разместил тот же ответ здесь: iphone">stackoverflow.com/questions/7187967/   -  person Ved    schedule 25.08.2011
comment
вы также можете сделать так, чтобы ваше приложение всегда работало в фоновом режиме, как работает google latitude и instagram. mindsizzlers.com/2011/07/ios-background-location   -  person Hrushikesh Betai    schedule 17.10.2012


Ответы (3)


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

Из того, что я понял из вашего кода, кажется, вам нравится обновлять местоположение, когда приложение работает в фоновом режиме. Для этого вам следует ознакомиться с рекомендациями здесь: https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW24

Существует несколько способов отслеживания местоположения пользователя в фоновом режиме, некоторые из которых на самом деле не требуют регулярной работы в фоновом режиме:

  • Приложения могут регистрироваться для значительных изменений местоположения. (Рекомендуется) Служба определения местоположения со значительными изменениями предлагает способ получения данных о местоположении с низким энергопотреблением и настоятельно рекомендуется для приложений, которым не требуются высокоточные данные о местоположении. С помощью этой службы обновления местоположения генерируются только при значительном изменении местоположения пользователя; таким образом, он идеально подходит для социальных приложений или приложений, которые предоставляют пользователю некритическую информацию, относящуюся к местоположению. Если приложение приостанавливается при обновлении, система пробуждает его в фоновом режиме для обработки обновления. Если приложение запускает эту службу, а затем закрывается, система автоматически перезапускает приложение, когда становится доступным новое местоположение. Эта служба доступна в iOS 4 и более поздних версиях только на устройствах с сотовой радиосвязью.
  • Приложения могут продолжать использовать стандартные службы определения местоположения. Хотя стандартные службы определения местоположения не предназначены для бесконечной работы в фоновом режиме, они доступны во всех версиях iOS и предоставляют обычные обновления во время работы приложения, в том числе в фоновом режиме. Однако обновления прекращаются, как только приложение приостанавливается или закрывается, а новые обновления местоположения не приводят к пробуждению или перезапуску приложения. Этот тип службы подходит, когда данные о местоположении используются в основном, когда приложение находится на переднем плане.
  • Приложение может объявить себя нуждающимся в непрерывных обновлениях местоположения в фоновом режиме. Приложение, которое нуждается в регулярных обновлениях местоположения, как в активном, так и в фоновом режиме, должно добавить ключ UIBackgroundModes в свой файл Info.plist и установить значение этого ключа в массив, содержащий строку местоположения. Этот параметр предназначен для приложений, предоставляющих определенные услуги, например службы навигации, которые включают в себя постоянное информирование пользователя о его или ее местоположении. Наличие ключа в файле Info.plist приложения сообщает системе, что она должна разрешить приложению работать в фоновом режиме по мере необходимости.

Вам рекомендуется использовать услугу значительного изменения местоположения или экономно использовать стандартные услуги. Службы определения местоположения требуют активного использования встроенного радиооборудования устройства iOS. Непрерывная работа этого оборудования может потреблять значительное количество энергии. Если вашему приложению не требуется предоставлять пользователю точную и непрерывную информацию о местоположении, лучше всего использовать те службы, которые минимизируют энергопотребление. Главным среди этих маломощных сервисов является сервис значительного изменения местоположения, представленный в iOS 4. Этот сервис обеспечивает периодические обновления местоположения и может даже разбудить фоновое приложение или перезапустить остановленное приложение, чтобы доставить их.

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

person prakash    schedule 25.08.2011

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

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

Реальное фоновое поведение предоставляется только для отслеживания местоположения, приложений VoIP или аудио. Другие приложения должны иметь ограничения: находясь в фоновом режиме, вам дается время для выполнения задач, которые вы начинаете с beginBackgroundTaskWithExpirationHandler: (backgroundTimeRemaining).

Все это описано в Руководстве по программированию приложений для iOS. , Выполнение кода в фоновом режиме, особенно здесь.

person Jilouc    schedule 25.08.2011
comment
извините, сэр, но эта ссылка ведет на любую другую страницу. как путеводитель и многое другое. - person Hrushikesh Betai; 25.08.2011
comment
@Hrushikesh извините, я вставил file://... ссылки из XCode вместо http. Я отредактировал ответ. - person Jilouc; 25.08.2011

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

person york    schedule 17.10.2012