Подтвердить что ты не робот

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

Я ищу приложение с открытым исходным кодом или библиотеку, чтобы отслеживать местоположение пользователя в фоновом режиме. Теперь я пытаюсь сделать это с помощью 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-часовой поездки

4b9b3361

Ответ 1

Используйте

kCLLocationAccuracyBestForNavigation

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

Ответ 2

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

Ответ 3

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

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

Это новое в ios6.

Из CLLocationManager:

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

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

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

Вы можете настроить материал местоположения мониторинга в своем 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

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

Ответ 6

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

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

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

Также tutorial.

Ответ 7

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

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

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;
}

Ответ 8

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

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

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

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

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