В этой статье написано о том, как получить информацию о местоположении. Рассмотрен самый простой метод без излишеств.

Теория

Для начала поставим перед собой задачу — узнать, что мы можем знать о местоположении устройства (iPhone, iPad) и как заполучить эту информацию.

Узнать мы можем следующее:

  • Высоту над уровнем моря
  • GPS координаты
  • Точность определения
  • Скорость (в метрах/секунду)
  • Направление (в градусах)

Все это несет в себе класс CLLocation. Свойства, которые нас интересуют в этом классе — это (соотвественно со списком выше):

  • altitude
  • coordinate
  • horizontalAccuracy, verticalAccuracy
  • speed
  • course

Все кажется просто, но этот класс напрямую использовать нельзя. Экземпляры этого класса нам доставляет класс CLLocationManger. Для этого нам нужно его создать и установить делегат, который следует CLLocationManagerDelegate и определить в нем метод:

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

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

Практика

Для работы с местоположением нам потребуется подключить framework CoreLocation.

Создайте новый ViewController и в заголовочном файле определите CLLocationManager:

#import <uikit/UIKit.h>

#import <coreLocation/CoreLocation.h>
@interface LocationInfoViewController : UIViewController<cllocationManagerDelegate> {
CLLocationManager* m_manager;
}
@end

Далее, во viewDidLoad создадим CLLocationManager, назначим делегат (себя) и запустим обновление.

- (void)viewDidLoad

{
[super viewDidLoad];
m_manager = [CLLocationManager new];
m_manager.delegate = self;
[m_manager startUpdatingLocation];
}

Осталось только определить метод принимающий изменения:

-(void) locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"Location updated to = %@",newLocation);
}

Теперь, если мы запустим все это на iPhone, в консоли увидим что-то вроде этого:

2011-06-20 00:36:38.874 LocationInfo[6320:707] Location updated to = <+53.93365924, +27.62006720> +/- 65.00m (speed -1.00 mps / course -1.00) @ 6/20/11 12:36:38 AM Eastern European Summer Time

К сожалению, запуск на симуляторе не принесет результатов (в iOS 4 и ниже, в iOS 5 вроде как решили проблему)

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

Плюшки

Имея два CLLocation можно узнать расстояние в метрах между ними. Предположим первый firstLocation, второй secondLocation, тогда расстояние между ними можно узнать используя метод

-(CLLocationDistance)distanceFromLocation:(const CLLocation *)location

Вот так:

CLLocationDistance distance = [firstLocation distanceFromLocation:secondLocation];

CLLocationDistance определено как double.

Итог

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

Работающий пример лежит тут

Похожие статьи

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

  • Как вводить в UITextField только цифры?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *