CLLocationManager класс

Введение

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

Объект CLLocationManager обеспечивает поддержку следующих видов деятельности, связанных с местоположением:

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

Чтобы настроить и использовать объект CLLocationManager для доставки событий:

  1. Всегда запрашивайте разрешение на использование услуги определения местоположения и проверьте, доступны ли желаемые услуги.
  2. Создайте экземпляр CLLocationManager и сохраните сильную ссылку на него в вашем приложении.

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

  3. Назначьте пользовательский объект для свойства delegate. Этот объект должен поддерживать CLLocationManagerDelegate протокол.
  4. Настройте дополнительные свойства, относящиеся к желаемой услуге.
  5. Вызовите подходящий метод старта, чтобы начать доставку событий.

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

Запрос разрешения использовать службы определения местоположения

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

  1. Вызовите метод класса authorizationStatus, для получения статуса авторизации для вашего приложения.

    Если статус авторизации kCLAuthorizationStatusRestricted или kCLAuthorizationStatusDenied, вашему приложению недоступен сервис определения местоположения, и вы должны отказаться от его использования.

  2. Создайте CLLocationManager объект и назначьте ему делегата.
  3. Сохраните сильную ссылку на созданный CLLocationManager объект.
  4. В iOS, если статус авторизации был kCLAuthorizationStatusNotDetermined, вызовите requestWhenInUseAuthorization или requestAlwaysAuthorization метод для запроса соответствующего типа авторизации от пользователя.
  5. В зависимости от необходимых вам сервисов, вызовите один или более из следующих методов:
    • Если вы используете стандартный сервис определения местоположения, вызовите locationServicesEnabled метод.
    • Если вы используете сервис изменения местоположения, вызовите метод significantLocationChangeMonitoringAvailable.
    • Если вы используете информацию о направлении, вызовите headingAvailable метод.
    • Если вы отслеживаете географический регион или регион маячка, вызовите isMonitoringAvailableForClass: метод.
    • Если вы отслеживаете Bluetooth маячки, вызовите isRangingAvailable.

Это обезопасит от запуска служб определения местоположения до авторизации приложения. Хотя вы можете начать использовать сервисы определения местоположения до авторизации на разрешение их использования, эти сервисы не доставляют каких-либо данных до изменения статуса авторизации в kCLAuthorizationStatusAuthorizedAlways или kCLAuthorizationStatusAuthorizedWhenInUse. Чтобы получать уведомления при изменении состояния авторизации, реализуйте locationManager:didChangeAuthorizationStatus: метод в вашем делегате менеджера определения местоположения.

Настройте свойства сервисов, которые вы используете, точно. Core Location управляет энергосбережением путем выключения оборудования, когда оно не нужно. Например, установка требуемой точности определения местоположения до километра дает менеджеру определения расположения гибкость, позволяя выключить GPS оборудование и полагаться исключительно на WiFi или сотовые радиоприемники, которые могут привести к значительной экономии энергии.

Получение текущей позиции местоположения

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

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

Стандартная служба определения местоположения является наиболее подходящей для приложений, которые поставляют информацию о местоположении, непосредственно связанную с пользователем, но она также может быть использована другими типами приложений. Чтобы запустить службу, настройте desiredAccuracy и distanceFilter свойства менеджера расположения, а затем вызовите requestLocation, startUpdatingLocation или allowDeferredLocationUpdatesUntilTraveled:timeout: метод. Никогда не указывайте значение точности больше, чем то, что вам необходимо. Core Location использует значение точности, которое вы указываете в управлении энергосбережением. Более высокой степени точности требуется более точное оборудование, такое как GPS, которое потребляет больше энергии.

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

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

Использование регионов для мониторинга пересечения границ

Вы можете использовать службу мониторинга региона, чтобы получать уведомления, когда пользователь пересекает регион на основе границ. Мониторинг региона относится как к географическим регионам (в лице класса CLCircularRegion) так, и маячковых регионов (в лице класса CLBeaconRegion). Вы можете использовать мониторинг региона для выявления граничных переходов указанного региона, и использования этих граничныех переходов для выполнения соответствующих задач. Например, при приближении к химчистке, приложение может уведомлять пользователя о необходимости забрать одежду, которая была туда сдана и теперь готова.

Чтобы начать мониторинг региона, настройте соответствующий объект региона и передайте его в метод startMonitoringForRegion: вашего менеджера определения местонахождения. В iOS, зарегистрированные регионы сохраняются между запусками вашего приложения. Если пересечение границы региона происходит в то время как ваше приложение IOS не работает, система автоматически будит его (или возобновляет его) в фоновом режиме, так что он может обрабатывать событие. В этом случае словарь опций передается application:didFinishLaunchingWithOptions: методом делегата вашего приложения и содержит ключ UIApplicationLaunchOptionsLocationKey чтобы указать, что ваше приложение было запущено из-за события связанного с расположением. В процессе перезапуска, вы должны пересоздать свой объект менеджера определения местоположения и назначить делегата, способного обрабатывать события регионов, связанных с ним. После того как вы это сделаете, система подает уведомление регионов, для которых было запущено ваше приложение. Все регионы настроенные ранее становятся доступны в свойстве monitoredRegions любого объекта менеджера местоположения, который вы создаете.

В OS X, мониторинг региона работает только тогда, когда приложение работает (либо в переднем или на заднем плане) и при этом система пользователя бодрствует. Система не запускает программы, чтобы доставить связанные уведомления региона. Аналогичным образом, если пользователь ставит компьютер в режим сна, то система не обеспечивает мониторинг регионов для вашего приложения. Если пользователь выводит из сна компьютер внутри контролируемого региона, система доставляет уведомления регионов в приложение, если оно работает. Тем не менее, если компьютер входит и выходит из области перед тем как пробудиться,не будет доставлено никаких уведомлений .

Служба мониторинга региона работает независимо от каких-либо служб определения местоположения, используемых вашим приложением, и вы можете использовать ее в сочетании с любым из других сервисов. Мониторинг регионов не поддерживается на всех устройствах. Для OS X используйте метод класса regionMonitoringAvailablecode>, чтобы определить, может ли быть использован мониторинг регионов.

Определение близости к маячкам

Вы можете использовать службу отслеживания маячков (beacon ranging service), чтобы определить приблизительное расстояние до устройств, которые поддерживают технологию IBeacon. Эта служба подразумевает прослушивание устройств, передающих свое присутствие поверх Bluetooth LE. Когда вы начинаете отслеживать, вы получите информацию об идентификаторе каждого маячка, который находится в диапазоне, в том числе информацию о том, что маячок рядом или далеко. Обновления доставляются, когда статус маячка меняется.

Чтобы начать отслеживать маячок, создайте объект, который идентифицирует CLBeaconRegion маячки, которые вы хотите передать, и этот объект в метод startRangingBeaconsInRegion:. Поскольку менеджер определения местоположения обнаруживает маячки, он поставляет эту информацию своему делегату через метод locationManager:didRangeBeacons:inRegion:. На площади, в которой активны несколько маячков и пользователь перемещается, обновления могут доставляться часто. Чтобы сохранить заряд батареи, не определяйте расстояние до маячков все время. Рекомендуемая практика заключается в использовании сервиса мониторинга области для обнаружения присутствия маячков для начала и начать отслеживать только после обнаружения одного или более маячков. И, конечно, вы должны прекратить отслеживать, как только у вас есть необходимая информация, или когда вы выходите из диапазона работы ваших маячков.

Настройка служб связанных с направлением

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

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

Получение посещаемых мест

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

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

Использование служб определения местоположения в фоновом режиме

Большинство служб определения местоположения предназначены для использования во время активного состояния вашего приложения, но некоторые также можгут работать в фоновом режиме. В некоторых случаях, события местоположения могут даже привести возобновлению обработки событий в вашем приложении. Чтобы запустить большинство служб определения местоположенияе в фоновом режиме, вам необходимо включить обновления местоположения в фонововом режиме во вкладке Capabilities вашего проекта Xcode. Для служб, которые запускают ваше приложение, вы должны запросить (и получить) "Всегда" разрешение от пользователя.

  • Стандартная служба определения местоположения доставляет события обычно в то время когда приложение работает на переднем плане. Когда ваше приложение работает в фоновом режиме, эта услуга доставляет события только тогда, когда включен фоновый режим для место-обновления в приложении. Эта услуга не перезапускает iOS приложения, которые были прекращены.
  • Значимые службы изменения местоположения обычно доставляют события в то время как приложение работает на переднем или заднем плане. Для прекращеного iOS приложения, эта служба перезапустит приложение для доставки события. Использование этой службы требует разрешение "Всегда" от пользователя.
  • Служба мониторинга региона доставляет события обычно в то время когда приложение работает на переднем или заднем плане. (Вы можете использовать этот сервис и для географических и для маячковых регионов). Для прекращено iOS приложения, эта служба перезапустит приложение для доставки события. Использование этой службы требует разрешения "Всегда" от пользователя.
  • Служба определения расстояния до маячков доставляет события обычно в то время когда приложение работает на переднем плане. Когда ваше приложение работает в фоновом режиме, эта услуга доставляет события только тогда, когда включен фоновый режим обновления местоположения для приложения и запущена стандартная служба определения местоположения. (Если свойство notifyEntryStateOnDisplay региона маячка установлено в YES, проснувшись устройство передает приложению диапазоны для маячков для нескольких секунд, пока оно было в фоновом режиме). Эта служба не перезапускает iOS приложения, которые были прекращены. Однако, вы можете перезапустить его с помощью мониторинга регионов маячка, используя службу мониторинга региона.
  • Служба определения направления обычно работает пока приложение работает на переднем плане. При переходе приложения в фоновый режим, служба продолжает посылать сообщения только если включен фоновый режим для определения местоположения и запущена стандартная служба определения местоположения. Эта служба не перезапускает iOS приложения, которые были прекращены.
  • Служба посещений обычно работает пока приложение работает на переднем плане. При переходе приложения в фоновый режим, служба продолжает посылать сообщения только если включен фоновый режим для определения местоположения и запущена стандартная служба определения местоположения. Для прекращенных iOS приложений эта служба перезапускает приложение для доставки событий. Использование этой службы требует разрешения "Всегда" от пользователя.

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

В iOS 8, а выше, отключение опции Background App Refresh для текущего приложения или для всех приложений не помешает доставке событий местоположения в фоновом режиме. В предыдущих версиях iOS, отключение Background App Refresh предотвращало доставку событий в фоновом режиме.

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

Если вашему приложению не нужно ничего делать с событиями определения местоположения сразу, рассмотрите вопрос о переносе обновления определения местоположения, используя метод allowDeferredLocationUpdatesUntilTraveled:timeout:. Отсрочка доставки обновлений местоположения облегчает Core Location сохранить жизнь батареи, при этом обеспечивая потребности приложения.

Авторизация и доступность служб

- requestWhenInUseAuthorization
- requestAlwaysAuthorization
+ authorizationStatus
+ locationServicesEnabled
+ deferredLocationUpdatesAvailable
+ significantLocationChangeMonitoringAvailable
+ headingAvailable
+ isMonitoringAvailableForClass:
+ isRangingAvailable

Делегат и инициация стандартных обновлений

delegate
- startUpdatingLocation
- stopUpdatingLocation
- requestLocation
pausesLocationUpdatesAutomatically
allowsBackgroundLocationUpdates
distanceFilter
desiredAccuracy
activityType

Инициирование значимых обновлений

- startMonitoringSignificantLocationChanges
- stopMonitoringSignificantLocationChanges

Инициация обновлений направления

- startUpdatingHeading
- stopUpdatingHeading
- dismissHeadingCalibrationDisplay
headingFilter
headingOrientation

Инициирование мониторинга региона

- startMonitoringForRegion:
- stopMonitoringForRegion:
monitoredRegions
maximumRegionMonitoringDistance

Инициирование отслеживания маячков

- startRangingBeaconsInRegion:
- stopRangingBeaconsInRegion:
- requestStateForRegion:
rangedRegions

Инициирование событий обновлений посещений

- startMonitoringVisits
- stopMonitoringVisits

Отложенные обновления местоположения

- allowDeferredLocationUpdatesUntilTraveled:timeout:
- disallowDeferredLocationUpdates

Получение последних полученных данных

location
heading

Константы CLLocationManager

CLAuthorizationStatus
CLActivityType
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac