среда, 5 июня 2013 г.

Получение и отправка на сервер координат iOS устройства

Одной из задач в разработке приложения для iPhone стала задача получить географические координаты iOS устройства (широту и долготу) и отправлить их на сервер. Реализуется данная задача с помощью использования классов из CoreLocation framework.  Для этого необходимо добавить CoreLocation framework к проекту.


Подключение фреймворка CoreLocation


Для подключения фреймворка CoreLocation выберите в Xcode ваш проект, перейдите в раздел TARGETS, далее выбирите вкладку Build Phases и там выберите раздел Link Binary Libraries. После этого добавьте CoreLocation framework к вашему проекту.




Объявление переменных и методов


В классе MainMenuViewController.h необходимо импортировать класс CoreLocation.h
#import <CoreLocation/CoreLocation.h>

// класс должен быть делегатом CLLocationManagerDelegate
@interface MainMenuViewController : UIViewController<CLLocationManagerDelegate>

В классе MainMenuViewController.h объявляем нужные нам методы и переменные.
// отправляем координаты на сервер
-(void) sendCoordinatesToServer: (long long)userId;
 
// получаем текущие координаты устройства
-(CLLocationCoordinate2D) findCurrentLocation;
 
// подключение для отправления координат на сервер
@property (retain, nonatomic) NSURLConnection *sendCoordinatesConnection;

Реализация методов


В классе MainMenuViewController.m необходимо импортировать класс CoreLocation.h
#import <CoreLocation/CoreLocation.h>

Также необходимо добавить
@synthesize sendCoordinatesConnection;

Метод, получения текущих геокоординат утсройства.
-(CLLocationCoordinate2D) findCurrentLocation {
 
    CLLocationManager *locationManager = [[CLLocationManager alloc]init];
 
    // проверяем доступно ли получение координат
    if ([CLLocationManager locationServicesEnabled]) {
 
        locationManager.delegate = self;
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        locationManager.distanceFilter = kCLDistanceFilterNone;
        // находим местоположение устройства
        [locationManager startUpdatingLocation];
 
    }
 
    // получаем местоположение
    CLLocation *location = [locationManager location];
 
    // определяем координаты 
    CLLocationCoordinate2D coordinate = [location coordinate];
 
    return coordinate;
 
}

Метод, который отправляет текущие коорднинаты на сервер
-(void) sendCoordinatesToServer:(long long) userId {
 
    NSString *serverAddress = SERVER_ADDRESS;
    NSString *restMethodAddress = @"/rest/users/saveCoordinates";
 
    NSString *userIdStr = [[NSNumber numberWithLongLong:userId] stringValue];
 
    // получаем координаты возвращаемые методом findCurrentLocation
    CLLocationCoordinate2D coordinate = [self findCurrentLocation];
 
    //  получаем широту и преобразовываем ее в строку 
    NSString *param1 = [@"?lat=" stringByAppendingString:[NSString stringWithFormat:@"%f", coordinate.latitude]];
 
    //  получаем долготу и преобразовываем ее в строку 
    NSString *param2 = [@"&lng=" stringByAppendingString:[NSString stringWithFormat:@"%f", coordinate.longitude]];
 
    NSString *param3 = [@"&userId=" stringByAppendingString:userIdStr];
 
    NSMutableString *fullRequestAddress = [NSMutableString stringWithString:serverAddress];
    [fullRequestAddress appendString:restMethodAddress];
    [fullRequestAddress appendString:param1];
    [fullRequestAddress appendString:param2];
    [fullRequestAddress appendString:param3];
 
    NSURL *sendCoordinatesURL = [NSURL URLWithString:fullRequestAddress];
 
    NSMutableURLRequest *sendCoordinatesRequest = [[NSMutableURLRequest alloc] initWithURL:sendCoordinatesURL];
 
    [sendCoordinatesRequest setHTTPMethod:@"GET"];
 
    // посылаем асинхронный запрос на сервер в котором отправляем широту и долготу
    sendCoordinatesConnection = [NSURLConnection connectionWithRequest:sendCoordinatesRequest delegate:self];
 
}

Внимание здесь стоит уделить получению непосредственно широты и долготы.
// получаем координаты возвращаемые методом findCurrentLocation
 CLLocationCoordinate2D coordinate = [self findCurrentLocation];
 
//  получаем широту 
coordinate.latitude
 
//  получаем долготу 
coordinate.longitude

Комментариев нет:

Отправить комментарий