O documento introduz o framework Core Location do iOS, que fornece APIs para obter dados de localização do usuário, como latitude, longitude e altitude. Ele explica como o Core Location obtém a localização através de triangulação de torres celulares, Wi-Fi e GPS, e descreve as classes e métodos principais como CLLocation, CLLocationManager e CLLocationManagerDelegate.
2. Core Location
• Framework para obtenção de dados de localização do
usuário
• CLHeading (Bússola)
• CLLocation
• CLLocationManager
• CLLocationManagerDelegate (Protocol)
• Disponível para dispositivos iOS (iPhone, iPad, iPod
Touch) e Mac OS X
• Não possui interface gráfica
• MapKit: API para exibição de mapas
3. Core Location
• Não permite acessar diretamente uma
tecnologia de localização específica
• O foco é no uso dos dados de localização
4. Obtendo a localização
Triangulação de torres de celular
Não é muito precisa, mas gasta pouca energia
Wi-Fi Positioning Service (WPS)
Mais precisa do que a triangulação; gasta mais energia
A-GPS (Assisted GPS)
Muito precisa; gasta muita energia
8. CLLocation
• Objeto que contém informações sobre a última
localização do dispositivo
//
Latitude
e
longitude
@property
CLLocationCoordinate2D
coordinate;
//
Altitude
em
metros.
Valor
negativo
significa
“abaixo
do
nível
do
mar”
@property
CLLocationDistance
altitude;
//
Raio
da
incerteza
da
localização
(em
metros)
//
Valor
negativo
indica
dado
inválido
@property
CLLocationAccuracy
horizontalAccuracy;
@property
CLLocationAccuracy
verticalAccuracy;
9. CLLocation
//
Constantes
para
definir
precisão
da
localização
kCLLocationAccuracyBestForNavigation;
//
plugado
na
tomada
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
//
Direção
(graus)
do
dispositivo
//
Sentido
horário:
0
-‐
Norte,
90
-‐
Leste,
(...)
@property
CLLocationDirection
course;
//
Velocidade
instantânea
(m/s)
@property
CLLocationSpeed
speed;
10. CLLocation
//
Instante
em
que
a
localização
foi
determinada
@property
NSDate
timeStamp;
//
Distância
(em
metros)
entre
dois
CCLocations
-‐
(CLLocationDistance)distanceFromLocation:(CLLocation
*)location
11.
12. CLLocationManager
• Interface responsável por “entregar” as
localizações
• Tipos de Location Monitoring:
• Standard Location Service: updates contínuos baseados em
precisão
• Significant-Change Location Service: updates somente
quando mudanças “significativas” nas localizações ocorrerem
(> iOS 4)
• Shape-Based Regions: updates baseados em regiões (> iOS 4)
• Heading monitoring
13. Utilização do CL
• Checar se o hardware suporta o tipo de “Location
Monitoring” desejado
• Criar uma instância de CLLocationManager
• Setar o seu delegate conforme o protocolo
CLLocationManagerDelegate
• Configurar propriedades relevantes (precisão,
“frequência” de atualizações)
• Iniciar o monitoramento de mudanças de localização
(chamar startUpdatingLocation)
• Para preservar energia, chamar stopUpdatingLocation
assim que possível
14. Exemplo
-‐
(void)viewDidLoad
{
self.locationManager
=
[[CLLocationManager
alloc]
init];
//
Delegate:
objeto
que
recebe
os
updates
de
localização
locationManager.delegate
=
self;
locationManager.desiredAccuracy
=
kCLLocationAccuracyBest;
//
distanceFilter:
distância
mínima
horizontal
(em
metros)
para
o
recebimento
de
updates
de
localização
//
kCLDistanceFilterNone:
notifica
sobre
todos
os
movimentos
locationManager.distanceFilter
=
10;
[locationManager
startUpdatingLocation];
}
kCLLocationAccuracyBestForNavigation;
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
15. CLLocationManagerDelegate
• Não é usual pedir ao CLLocationManager por novas
localizações
• Abordagem padrão: Manager informa sobre updates via
delegate
• Quando uma classe implementa o protocolo (interface)
CCLocationManagerDelegate, é “opcional” implementar
dois métodos:
• locationManager:didUpdateToLocation:fromLocation:
• locationManager:didFailWithError:
16. Mudanças na localização
-‐
(void)locationManager:(CLLocationManager
*)manager
didUpdateToLocation:(CLLocation
*)newLocation
fromLocation:(CLLocation
*)oldLocation
{
if
(startingPoint
==
nil)
self.startingPoint
=
newLocation;
//
Exibir
a
latitude
em
um
label
NSString
*latitudeString
=
[[NSString
alloc]
initWithFormat:@"%gu00B0",
newLocation.coordinate.latitude];
latitudeLabel.text
=
latitudeString;
[latitudeString
release];
}
18. Notificações de Erros
• kCLErrorLocationUnknown:
falha na localização (continue
tentando!)
• kCLErrorDenied: usuário se
recusou a fornecer a localização
19. Notificações de Erros
-‐
(void)locationManager:(CLLocationManager
*)manager
didFailWithError:(NSError
*)error
{
NSString
*errorType
=
(error.code
==
kCLErrorDenied)
?
@"Access
Denied"
:
@"Unknown
Error";
//
Exibir
um
alert
com
a
mensagem
de
erro
UIAlertView
*alert
=
[[UIAlertView
alloc]
initWithTitle:@"Error
getting
Location"
message:errorType
delegate:nil
cancelButtonTitle:@"Okay"
otherButtonTitles:nil];
[alert
show];
[alert
release];
}