Agora vamos ver algo um pouco mais divertido, e que faz um grande sucesso no mundo do iPhone, o famoso GPS. Vamos lembrar porém, que no simulador, o GPS segue parâmetros fixos, pois o computador não possui GPS. Ele mantém estes valores fixos, apenas com a intenção de ajudar no nosso desenvolvimento.
Com o GPS podemos ter acesso às seguintes informações:
-
- Ponto Inicial: Podemos marcar um ponto inicial do uso do GPS. Este ponto inicial pode ser útil caso precisemos saber qual uma distância percorrida, por exemplo.
- Latitude: Como o nome diz, informa a Latitude da sua localização em graus.
- Longitude: Adivinha? Informa a Longitude da sua localização em graus.
- Altitude: Informa a Altitude que você se encontra.
Para usarmos o GPS do iPhone, é necessário acrescentar um framework no nosso projeto. No caso vamos adicionar o framework CoreLocation. Este framework já possui uma série de métodos prontos para serem usados, o que torna a nossa vida mais tranquila. Perceba que vamos chamar apenas métodos prontos para conseguir as nossas coordenadas GPS.
Antes de iniciarmos, vale uma informação importante. Quando o local aonde você se encontra não consegue receber o sinal GPS (isto ocorre muito em ambientes fechados), ele parte para o sistema de triangulação de antenas. Este sistema de triangulação não é uma localização precisa. Para manter um sistema preciso usando GPS mesmo, é necessário fazer algumas implementações para consistir a perda de sinal GPS e projetar a falta do mesmo. Mas isso poderemos aprender em outra ocasião.
Vamos criar um projeto chamado iGPS.
Adicionando o CoreLocation
Vamos agora adicionar o framework CoreLocation. Depois de criado o projeto, de um click na pasta Frameworks. Vá até o Menu Project / Add to Project:

Ao escolher Add to Project, selecione o seguinte caminho:
-
- HD;
- Developer;
- Platforms
- iPhone Simulator;
- Developer;
- SDK;
- iPhoneSimulator 3.0 (ou 3.1);
- System;
- Library;
- Frameworks;
Ao chegar neste caminho selecione CoreLocation.framework.
No arquivo MainViewController.h, implemente o seguinte código:
#import “FlipsideViewController.h”
#import <CoreLocation/CoreLocation.h>
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, CLLocationManagerDelegate> {
CLLocationManager *locationManager;
CLLocation *startingPoint;
UILabel *latitudeLabel;
UILabel *longitudeLabel;
UILabel *horizontalAccuracyLabel;
UILabel *altitudeLabel;
UILabel *verticalAccuracyLabel;
UILabel *distanceTraveledLabel;
}
@property (retain, nonatomic) CLLocationManager *locationManager;
@property (retain, nonatomic) CLLocation *startingPoint;
@property (retain, nonatomic) IBOutlet UILabel *latitudeLabel;
@property (retain, nonatomic) IBOutlet UILabel *longitudeLabel;
@property (retain, nonatomic) IBOutlet UILabel *horizontalAccuracyLabel;
@property (retain, nonatomic) IBOutlet UILabel *altitudeLabel;
@property (retain, nonatomic) IBOutlet UILabel *verticalAccuracyLabel;
@property (retain, nonatomic) IBOutlet UILabel *distanceTraveledLabel;
- (IBAction)showInfo;
@end
Observe que estamos importando o framework CoreLocation na segunda linha, e na declaração da interface existe uma delegação CLLocationManagerDelegate. Na declaração das variáveis foram usados dois tipos de componentes específicos do novo framework, CLLocationManager e CLLocation. Eles serão a base para montar os cálculos do GPS.
No arquivo MainViewController.m, implemente o seguinte código:
#import “MainViewController.h”
#import “MainView.h”
@implementation MainViewController
@synthesize locationManager;
@synthesize startingPoint;
@synthesize latitudeLabel;
@synthesize longitudeLabel;
@synthesize horizontalAccuracyLabel;
@synthesize altitudeLabel;
@synthesize verticalAccuracyLabel;
@synthesize distanceTraveledLabel;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad {
self.locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller {
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)showInfo {
FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@”FlipsideView” bundle:nil];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
self.locationManager = nil;
self.latitudeLabel = nil;
self.longitudeLabel = nil;
self.horizontalAccuracyLabel = nil;
self.altitudeLabel = nil;
self.verticalAccuracyLabel = nil;
self.distanceTraveledLabel = nil;
[super viewDidUnload];
}
- (void)dealloc {
[locationManager release];
[startingPoint release];
[latitudeLabel release];
[longitudeLabel release];
[horizontalAccuracyLabel release];
[altitudeLabel release];
[verticalAccuracyLabel release];
[distanceTraveledLabel release];
[super dealloc];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
if (startingPoint == nil)
self.startingPoint = newLocation;
NSString *latitudeString = [[NSString alloc] initWithFormat:@”%g°”, newLocation.coordinate.latitude];
latitudeLabel.text = latitudeString;
[latitudeString release];
NSString *longitudeString = [[NSString alloc] initWithFormat:@”%g°”, newLocation.coordinate.longitude];
longitudeLabel.text = longitudeString;
[longitudeString release];
NSString *horizontalAccuracyString = [[NSString alloc] initWithFormat:@”%gm”, newLocation.horizontalAccuracy];
horizontalAccuracyLabel.text = horizontalAccuracyString;
[horizontalAccuracyString release];
NSString *altitudeString = [[NSString alloc] initWithFormat:@”%gm”, newLocation.altitude];
altitudeLabel.text = altitudeString;
[altitudeString release];
NSString *verticalAccuracyString = [[NSString alloc] initWithFormat:@”%gm”, newLocation.verticalAccuracy];
verticalAccuracyLabel.text = verticalAccuracyString;
[verticalAccuracyString release];
CLLocationDistance distance = [newLocation getDistanceFrom:startingPoint];
NSString *distanceString = [[NSString alloc] initWithFormat:@”%gm”, distance];
distanceTraveledLabel.text = distanceString;
[distanceString release];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSString *errorType = (error.code == kCLErrorDenied) ? @”Access Denied” : @”Unknown Error”;
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Error getting Location” message:errorType delegate:nil cancelButtonTitle:@”Okay” otherButtonTitles:nil];
[alert show];
[alert release];
}
@end
Observe no código que existem variáveis pré definidas, que aparentemente não declaramos, por exemplo kCLLocationAccuracyBest. Na verdade esta variável está declarada no framework CoreLocation e por isto não precisamos declarar explicidamente no nosso código.
Rode o aplicativo e divirta-se.
(@AdemarVarela)