Как отслеживать местоположение пользователя в фоновом режиме?

Я ищу приложение с открытым исходным кодом или библиотеку для отслеживания местоположения пользователя в фоновом режиме. Теперь я пытаюсь сделать это с помощью CLLocation и фоновых задач, но для моего дела недостаточно точности. Не могли бы вы объяснить, как приложения, такие как «ходы», «runkeeper», «endmondo», создают мой маршрут? Следует ли использовать акселерометр или компас для создания маршрута между базовыми точками CLLocation?

Некоторый код:

 //location manager init self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.delegate = self; #pragma mark - CLLocationManager Delegate - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { if ([self isInBackground]) { if (self.locationUpdatedInBackground) { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; self.locationUpdatedInBackground(newLocation); [self endBackgroundTask]; } } else { if (self.locationUpdatedInForeground) { self.locationUpdatedInForeground(newLocation); } } } 

UPD: Justed проверил мое приложение со следующими свойствами

 self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; self.locationManager.activityType = CLActivityTypeFitness; self.locationManager.pausesLocationUpdatesAutomatically=NO; 

В этом случае у меня около 10 обстрелянных событий в течение 1,5-часовой поездки

использование

kCLLocationAccuracyBestForNavigation

проверьте это .

Вам нужно добавить в свой файл «Info.plist» ключ UIBackgroundModes (массив) со значением «location» (регистры приложений для обновлений местоположения). Здесь вы можете проверить все фоновые режимы.

Таким образом, ваше приложение использует службы определения местоположения. Затем прочитайте руководство по программированию местоположения .

Вы должны внести некоторые изменения в свой Info.plist:

  • Если ваше приложение полагается на правильные функции определения местоположения, добавьте сервисы местоположения в UIRequiredDeviceCapabilities
  • если ваше приложение требует оборудования GPS, добавьте gps в UIRequiredDeviceCapabilities
  • если вам нужно запустить приложение более 10 минут в фоновом режиме, добавьте его в UIBackgroundModes. Затем ваш менеджер местоположения будет предоставлять места за пределами 10-минутного предела.
  • вы также должны установить NSLocationUsageDescription (также можно локализовать)

Получение событий местоположения в фоновом режиме

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

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

Ваша проблема – обработчик фона. Удалите его и включите режим фона gps в файле plist. то вы должны получать полную мощность gps все время.

Установить pausesLocationUpdatesAutomatically=NO

Это новое в ios6.

От CLLocationManager :

Разрешение диспетчеру местоположения приостанавливать обновления может улучшить срок службы батареи на целевом устройстве, не жертвуя данными о местоположении. Если для этого свойства установлено значение «ДА», диспетчер местоположений приостанавливает обновления (и отключает соответствующее оборудование) в моменты, когда данные местоположения вряд ли изменятся. Например, если пользователь останавливается на еде при использовании навигационного приложения, менеджер местоположений может приостанавливать обновления в течение определенного периода времени. Вы можете помочь определить, когда приостанавливать обновления местоположения, назначая значение свойству activityType.

Значением по умолчанию этого свойства является ДА.

Для анализа добавьте эти методы в свой делегат LocationManager:

 - (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager { NSLog(@"locMan: locationManagerDidPauseLocationUpdates"); } - (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager { NSLog(@"locMan: locationManagerDidResumeLocationUpdates"); } 

Вы можете настроить материал для мониторинга в вашем VC, как показано ниже

in viewDidLoad сделать так, как показано ниже

 CLLocationManager locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = kCLDistanceFilterNone; locationManager.desiredAccuracy = kCLLocationAccuracyBest;(Accuracy according to your need) [locationManager startUpdatingLocation]; 

чем вы должны переопределить ниже двух необязательных методов делегирования протокола CLLocationManagerDelegate

для iOS6 +

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 

и для iOS 2-6

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 

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

вы не запрашиваете код. Вы просите: «Я ищу приложение с открытым исходным кодом или библиотеку»

Это может помочь вам посетить этот сайт.

надеюсь, что это поможет вам,

Также учебник .

Вот мое решение этого,

Объявить переменную экземпляра:

 CLLocationManager *locationManager; 

Обязательно включите делегат

 <CLLocationManagerDelegate> 

В viewDidLoad:

 locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move, location is updated locationManager.desiredAccuracy = kCLLocationAccuracyBest; // get best current locaton coords locationManager.headingFilter = 1; [locationManager startUpdatingLocation]; [locationManager startUpdatingHeading]; 

Внедрить метод делегата:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { int degrees = newLocation.coordinate.latitude; double decimal = fabs(newLocation.coordinate.latitude - degrees); int minutes = decimal * 60; double seconds = decimal * 3600 - minutes * 60; NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds]; NSLog(@" Current Latitude : %@",lat); latitudeLocation.text = lat; degrees = newLocation.coordinate.longitude; decimal = fabs(newLocation.coordinate.longitude - degrees); minutes = decimal * 60; seconds = decimal * 3600 - minutes * 60; NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"", degrees, minutes, seconds]; NSLog(@" Current Longitude : %@",longt); longitudeLocation.text = longt; } 

Отказ от ответственности: я работаю для Cintric

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

Мы опубликовали замечательное сообщение в блоге о том, как мы его решили. А также предоставляют решение для перетаскивания SDK. Это не открытый исходный код, но вы можете интегрировать его бесплатно:

Вы можете загрузить файл .framework, перетащить его в свой проект и инициализировать с помощью одной строки кода: [CintricFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];

Вы можете получить ключ API бесплатно. Здесь есть документы, объясняющие все.

  • Как сделать первый запуск руководства для iPhone App с Xcode
  • Невозможно изменить размер UIButton
  • Распределение предприятий iOS 7 на защищенном сервере
  • Раскадровка - автоматическая термоусадка UILabel не работает
  • Карты iOS 6.0 периодически вылетают
  • вызов отменяет смену кадра
  • Обнаружение, если NSString - Base64
  • iOS: нажатие на UITableView не вызывает didSelectRowAtIndexPath
  • Fade out Запустите изображение на 4-дюймовом экране iPhone
  • Как воспроизвести кнопку для переключения setUserTrackingMode в MapView под ios6?
  • Нужно ли создавать подпапки в Documents перед вызовом writeToFile с путём, который содержит новую папку?
  • Interesting Posts

    SKTextureAtlas textureNamed не автоматически находит суффиксы текстур @ 3x в XCode 6 GM Seed

    Показывать экран заставки, когда приложение вводит фон

    UIAutomation: изменение местоположения, когда приложение находится в фоновом режиме

    Уведомления iOS Push: как получить «идентификатор уведомления» в делегате

    Кодовая база для статической библиотеки iOS для приложений с белой меткой

    Cryptic NSInternalInconsistencyException при выполнении модульных тестов в Xcode 9 GM

    В Xcode 5 возникает ошибка при добавлении сервера под контроль источника

    iOS создать объект

    Исходные данные RestKit NSError dealloc Crash

    Нажмите «Определить маркер», как получить название

    Есть ли способ просмотреть UIViewController за другим UIViewController, не входя в окно AppDelegate?

    Оказание огромной сетки в контейнере Scrollview без CATiledLayer?

    Как скрыть цифровую клавиатуру iOS

    Progressbar WebView в Swift

    Рекомендации по настройке ограничений ширины и высоты автоопределения для ячейки представления коллекции?

    Давайте будем гением компьютера.