Download - Introdução ao Core Location para iOS
Introdução aoCore Location para iOS
5º FastShow QualidataFelipe Souto@felipesouto
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
Core Location
• Não permite acessar diretamente uma tecnologia de localização específica
• O foco é no uso dos dados de localização
Obtendo a localizaçãoTriangulação de torres de celular
Wi-Fi Positioning Service (WPS)
A-GPS (Assisted GPS)
Não é muito precisa, mas gasta pouca energia
Mais precisa do que a triangulação; gasta mais energia
Muito precisa; gasta muita energia
Triangulação de torres
Wi-Fi Positioning
GPS
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;
CLLocation// Constantes para definir precisão da localizaçãokCLLocationAccuracyBestForNavigation; // plugado na tomadakCLLocationAccuracyBest;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;
CLLocation// Instante em que a localização foi determinada@property NSDate timeStamp;
// Distância (em metros) entre dois CCLocations-‐ (CLLocationDistance)distanceFromLocation:(CLLocation *)location
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
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
Exemplo-‐ (void)viewDidLoad {
self.locationManager = [[CLLocationManager alloc] init];// Delegate: objeto que recebe os updates de localizaçãolocationManager.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 movimentoslocationManager.distanceFilter = 10;[locationManager startUpdatingLocation];
} kCLLocationAccuracyBestForNavigation;kCLLocationAccuracyBest;kCLLocationAccuracyNearestTenMeters;kCLLocationAccuracyHundredMeters;kCLLocationAccuracyKilometer;kCLLocationAccuracyThreeKilometers;
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:
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:@"%g\u00B0", newLocation.coordinate.latitude]; latitudeLabel.text = latitudeString; [latitudeString release];}
Notificações de Erros
Notificações de Erros
• kCLErrorLocationUnknown: falha na localização (continue tentando!)
• kCLErrorDenied: usuário se recusou a fornecer a localização
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 erroUIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error getting Location"
message:errorType delegate:nilcancelButtonTitle:@"Okay" otherButtonTitles:nil];
[alert show];[alert release];
}
Dúvidas?