ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

5. Функции устройства (Device API)

Определение координат (CoreLocation)

Большинству читателей известно, что в iPhone оборудован GPS модулем. Но не многие знают как программно его использовать. Этот пример будет отправной точкой в определении местоположения устройства и работе с картами.

Создадим новый проект на основе шаблона Single View Application и назовем его MyLocation. Перед тем как определять координаты, я предлагаю добавить две надписи, в которые мы будем выводить информацию о местоположении устройства. Теперь следует добавить в проект фреймверк CoreLocation, он будет проделывать основную работу по определению координат. Осталось совсем не много. Внесем изменения в файл ViewController.h:

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;
#import &lt;CoreLocation/CoreLocation.h&gt;
#import &lt;CoreLocation/CLLocation.h&gt;

@interface ViewController : UIViewController &lt;CLLocationManagerDelegate&gt;

@property (nonatomic, retain) CLLocationManager *gps;
@property (nonatomic, retain) IBOutlet UILabel *infoOldLocation;
@property (nonatomic, retain) IBOutlet UILabel *infoNewLocation;

@end</code>

В нем мы импортировали классы фреймверка CoreLocation, подключили протокол CLLocationManagerDelegate и добавили свойства для менеджера определения местоположения и надписей.

Соответственно, изменим файл ViewController.m:

<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize gps;
@synthesize infoOldLocation;
@synthesize infoNewLocation;

- (void)dealloc {
    self.gps = nil;
    self.infoOldLocation = nil;
    self.infoNewLocation = nil;
    [super dealloc];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    self.infoOldLocation = nil;
    self.infoNewLocation = nil;    
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.gps = [[CLLocationManager new] autorelease];
    gps.delegate = self;
    gps.desiredAccuracy = kCLLocationAccuracyBest;
    [gps startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)locationManager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation;
{
    infoOldLocation.text = [NSString stringWithFormat:
                            @"latitude:%f, longitude:%f"
                            "Altitude: %f"
                            "Updated: %@",
                            oldLocation.coordinate.latitude, 
                            oldLocation.coordinate.longitude,
                            oldLocation.altitude,
                            oldLocation.timestamp];

    infoNewLocation.text = [NSString stringWithFormat:
                            @"latitude:%f, longitude:%f"
                            "Altitude: %f"
                            "Updated: %@",
                            newLocation.coordinate.latitude, 
                            newLocation.coordinate.longitude,
                            newLocation.altitude,
                            newLocation.timestamp];
}

@end</code>

Первым делом мы синтезировали методы доступа и организовали очистку памяти для объектов, которым добавляли свойства. В методе viewDidLoad инициализируем объект класса CLLocationManager и устанавливаем делегатом текущий контроллер (в нем будут вызываться методы протокола CLLocationManagerDelegate). Затем мы устанавливаем свойству desiredAccuracyзначение kCLLocationAccuracyBest, таким образом, указываем, что хотим получать координаты с максимальной точностью. В последней строке запускаем процесс получения координат (для остановки этого процесса следует использовать метод stopUpdatingLocation).

После старта получения координат будет вызываться метод didUpdateToLocation:, в который приходят информация о старом и новом местоположении. Полученную информацию мы выводим в надписи (не забудьте надписи интерфейса связать с объектами кода).

Исходный код этого проекта можно скачать здесь.

Comments are closed.