• Core Location
  • Карты и локация
    • Получение местоположения пользователя
 

Получение местоположения пользователя

Приложения используют данные о местоположении для различных целей, например приложения соцсетей запускают время от времени навигационные сервисы. Они получают данные о местоположении через классы библиотеки Core Location. Эта библиотека предоставляет различные службы, которые вы можете использовать для получения и отслеживания текущего местоположения устройства.

Чтобы использовать Core Location вам необходимо подключить CoreLocation.framework в ваш Xcode проект. Для получения доступа к классам и заголовкам, включите #import <CoreLocation/CoreLocation.h> в начало файла реализации, использующего Core Location. Также, начиная с iOS 8, файл Info.plist должен содержать ключ NSLocationWhenInUseUsageDescription со сторокой запроса на разрешение использования служб геолокации для приложения.

Требование присутствия служб геолокации в iOS приложении.

Если ваше iOS приложение требует наличия служб геолокации для своего функционирования, включите ключ UIRequiredDeviceCapabilities в файл Info.plist вашего приложения. App Store использует информацию из этого ключа, чтобы удержать пользователя, устройство которого не поддерживает эти службы, от загрузки приложения. Содержимое этого ключа является массивом, содержащим технические требования для вашего приложения. Две строки соответствуют службе геолокации:

  • location-services - строка, если вам требуется службы определения местоположения в целом.
  • gps - строка, если вашему приложению необходима точность соответствующая только GPS оборудованию.
Важно: Если ваше iOS приложение пользуется службами определения местоположения, но может успешно функционировать и без них, не включайте соответствующие строки в ключ UIRequiredDeviceCapabilities.
 

Получение текущего местоположения пользователя

Core Location позволяет получить ваше местоположение от устройства и использовать ее в вашем приложении. Существует нескодько вариантов настройки услуги определения местоположения, связанные с:

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

Для подробной информации об использовании этих служб см. "CLLocationManager класс".

Запуск стандартной службы определения местоположения

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

Чтобы использовать стандартную службу определения местоположения создайте экземпляр CLLocationManager класса и задайте его свойства desiredAccuracy и distanceFilter. Для обеспечения приема сообщений об изменении местоположения назначте делегат (CLLocationManagerDelegate) созданному экземпляру CLLocationManager и вызовите startUpdatingLocation. Как только данные о местоположении становятся доступны, менеджер определения местоположения посылает уведомление своему делегату. Если уведомления об обновлении местоположения уже были доставлены, вы также можете получить самые последние данные о местоположении непосредственно от объекта CLLocationManager не дожидаясь доставки нового события. Чтобы остановить доставку обновлений местоположения, вызовите метод stopUpdatingLocation объекта менеджера местоположения. Ниже приведен пример запуска стандартной службы определения местоположения:

- (void)startLocation
{
  // проверяем доступность службы геолокации
  if([CLLocationManager locationServicesEnabled]){
    if(!locationManager)
      locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    // задаем наилучшую точность и дистанцию фильтра в 100 метров
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = 100;
    // данный селектор поддерживается только начиная с iOS 8, и его вызов необходим для запуска
    if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
      [locationManager requestWhenInUseAuthorization];
    }
    [locationManager startUpdatingLocation];
  }
}

Запуск значимой службы изменения местоположения

Служба значимого изменения местоположения, обеспечивает точность, вполне достаточную для большинства приложений и представляет собой энергосберегающую альтернативу стандартной службе определения местоположения. Сервис использует Wi-Fi, чтобы определить местоположение и регистрировать изменение положения пользователя в этом месте, что позволяет системе управления энергопотреблением работать гораздо более эфективно. Служба значимого изменения местоположения может пробуждать приложение iOS, которое в настоящее время приостановлено или не запущено для того, чтобы доставлять новые данные о местоположении.

Чтобы использовать значимую службу изменения местоположения создайте экземпляр CLLocationManager класса и назначте его делегат (CLLocationManagerDelegate), затем вызовите метод startMonitoringSignificantLocationChanges. Для остановки мониторинга значимых изменений местоположения вызовите метод stopMonitoringSignificantLocationChanges.

Если оставить запущенную службу значимого изменения местоположения и ваше приложение iOS впоследствии приостановлено или завершено, служба автоматически пробуждает ваше приложение при поступлении новых данных о местоположении. Во время пробуждения, приложение помещается в фоновый режим, и вы получаете небольшое количество времени (около 10 секунд), чтобы вручную перезапустить службы определения местоположения и обрабатывать данные о местоположении. (Вы должны вручную перезапустить службы местоположения в фоновом режиме, прежде чем какие-либо отложенные обновления местоположения могут быть доставлены). Поскольку ваше приложение работает в фоновом режиме, оно должно сделать минимальную работу и избежать каких-либо задач (например, запросов доступа к сети), что может помешать его возвращению до истечения выделенного времени. Если это не так, то ваше приложение будет прекращено. Если приложение iOS требует больше времени для обработки данных о местоположении, оно может запросить дополнительное время выполнения в фоне с помощью метода beginBackgroundTaskWithName:expirationHandler: класса UIApplication.

Принятие данных о местоположении

Чтобы получить события о местоположении как от стандартной так и от значимой службы определения местоположения надо реализовать метод locationManager:didUpdateLocations: делегата CLLocationManagerDelegate. При возникновении ошибки, менеджер определения местоположения вызывает метод делегата locationManager:didFailWithError:. Пример реализации делегата:

// Метод делегата CLLocationManagerDelegate протокола.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
   CLLocation* location = [locations lastObject];
   // получаем время определения местоположения
   NSDate* eventDate = location.timestamp;
   // получаем временной интервал с последнего определения до текущего момента
   NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
   if (abs(howRecent) < 15.0) {
      // Если событие недавнее (последние 15 секунд), что-то делаем с ним.
      NSLog(@"latitude %+.6f, longitude %+.6f\n",
              location.coordinate.latitude,
              location.coordinate.longitude);
   }
}
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac