Содержание
В этой статье написано о том, как получить информацию о местоположении. Рассмотрен самый простой метод без излишеств.
Теория
Для начала поставим перед собой задачу — узнать, что мы можем знать о местоположении устройства (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 только цифры?
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: