Приложение отслеживания GPS iOS, которое работает все время

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

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

Есть ли способ заставить это приложение работать все время и получить местоположение GPS?

Спасибо.

Ответ 1

У вас есть два варианта здесь:

1) Регулярное отслеживание местоположения.
Этот тип отслеживания работает с kCLAuthorizationStatusAuthorizedWhenInUse и kCLAuthorizationStatusAuthorizedAlways. Когда CLLocationManager запустил отслеживание местоположения один раз, он получит обновления местоположения в методе делегата locationManager:didUpdateLocations: Приложение может перейти в приостановленное состояние, но когда менеджер местоположений получает новое местоположение, приложение переходит в фоновое состояние и обрабатывает новое местоположение в методе делегата. Как настроить диспетчер местоположения:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Setup location tracker accuracy
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

    // Distance filter
    self.locationManager.distanceFilter = 50.f;

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // This setup pauses location manager if location wasn't changed
    [self.locationManager setPausesLocationUpdatesAutomatically:YES];

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startUpdatingLocation];
}


2) Отслеживание изменений местоположения.
Этот тип отслеживания работает только с авторизацией kCLAuthorizationStatusAuthorizedAlways. Он получает новое местоположение только каждые 500 метров, поэтому фильтр расстояния и требуемая точность здесь не работают. Приложение может перейти в приостановленное состояние и даже может быть прервано системой, но при обновлении местоположения приложение переходит в фоновое состояние и получает местоположение в методе делегата locationManager:didUpdateLocations:
Если приложение было UIApplicationLaunchOptionsLocationKey системой, оно будет перезапущено в фоновом режиме с ключом UIApplicationLaunchOptionsLocationKey в параметрах запуска в didFinishLaunchingWithOptions делегата приложения didFinishLaunchingWithOptions. Как настроить этот тип на отслеживание:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startMonitoringSignificantLocationChanges];
}


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


ОБНОВЛЕНИЕ (соответствует комментариям)

Вот мои примеры кода, которые работают для меня:
Для регулярного отслеживания. Запустите пример, предоставьте доступ к местоположению пользователя, нажмите кнопку "Пуск", чтобы начать обновление местоположения. Для проверки местоположения в симуляторе выберите в меню симулятора "Отладка"> "Расположение"> "Автострада". Теперь вы можете переместить приложение в фоновый режим с помощью кнопки "Домой" (Ctrl + Shift + H). Оставьте симулятор более 10 минут, и все это время приложение будет получать локации. Когда вы вернетесь в приложение, вы увидите красные булавки на карте.
Для значительных изменений. Запустите приложение и протестируйте так же, как в предыдущем примере.
Мониторинг Значительных изменений можно запустить только методом [self.locationManager startMonitoringSignificantLocationChanges];

ОБНОВЛЕНИЕ (iOS 11)

Изменения в отслеживании местоположения в iOS 11

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

перейдите по этой ссылке: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/

Ответ 2

В ответ на комментарий 1 в решении (я еще ничего не могу прокомментировать): вы, похоже, не решили проблему, так как ваше приложение приостанавливается и больше не обновляет местоположение через 10 минут.

У меня была такая же проблема: я установил setAllowsBackgroundLocationUpdates в YES, и у меня был ключ NSLocationAlwaysUsageDescription в моем Info.plist, но мое приложение также использовало для остановки отслеживания местоположения через 10 минут.

Я решил это, добавив как NSLocationAlwaysUsageDescription, так и NSLocationWhenInUseUsageDescription в файл Info.plist, чтобы он выглядел так:

    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs to use your location</string>

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs to use your location</string>

Ответ 3

установите it.it возьмите питание от батареи, но ваше приложение запустится в Background.OS не приостанавливает ваше приложение.

[self.locationManager setPausesLocationUpdatesAutomatically:NO];

Ответ 4

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

Недавно я работал с тем же требованием. После 2-3 недель тяжелой работы я это сделал. Для других пользователей я создаю вспомогательный класс для него. Который доступен в GitHub.

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

Менеджер местоположений, который позволяет получать фоновые обновления местоположения каждые n секунд с желаемой точностью местоположения.

Преимущество:

  • ОС никогда не убьет наше приложение, если в данный момент запущен менеджер местоположений.

  • Периодически обновлять местоположение, когда это требуется (диапазон составляет от 2 до 170 секунд (ограничено максимально допустимым временем фоновой задачи))

  • Настраиваемая точность местоположения и период времени.

  • Низкое потребление памяти (класс Singleton)