Проблема при работе в фоновом режиме и Nstimer? - PullRequest
2 голосов
/ 25 августа 2011

Привет, у меня есть atask для разработки приложения с 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);

}

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

Ответы [ 3 ]

4 голосов
/ 25 августа 2011

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

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

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

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

3 голосов
/ 17 октября 2012

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

3 голосов
/ 25 августа 2011

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

Судя по тому, что я понял из вашего кода, вам кажется, что вам нужно обновлять местоположение, когда приложение работает в фоновом режиме. Для этого вы должны проверить руководящие принципы здесь: 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. Этот сервис предоставляет периодические обновления местоположения и даже может разбудить фон приложение или перезапустить прекращенное приложение, чтобы доставить их.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...