Dans ce chapitre, vous allez apprendre à utiliser quelques-unes des méthodes du framework CoreLocation
pour « géolocaliser » (c'est-à-dire obtenir la position) d'un iPhone, iPad ou iPod Touch. Vous apprendrez également à calculer la vitesse de déplacement du device et à transformer un couple longitude/latitude en une adresse physique, bien plus parlante pour nous, pauvres humains.
Longitude et latitude
Pour donner la position d'un point sur la Terre, on utilise souvent sa latitude et sa longitude.
Un parallèle est un cercle imaginaire parallèle à l'équateur.
La latitude est la distance mesurée en degrés qui sépare un parallèle de l'équateur.
Un méridien est un demi-cercle imaginaire qui relie les deux pôles.
Les méridiens de référence utilisés sont celui de Greenwich (longitude 0°) et celui de l'observatoire de Paris (2°20'14,025 à l'est du méridien de Greenwich).
La longitude est la distance mesurée en degrés qui sépare un méridien du méridien de référence.
Si vous avez un peu de mal à vous représenter tout ça, je vous conseille de regarder la figure suivante.

Ces quelques notions de base étant posées, nous allons définir une application qui renvoie la longitude et la latitude d'un device (iPhone, iPod Touch ou iPad 2). Les informations de géolocalisation utilisées pourront provenir de réseaux cellulaires, Wi-Fi et/ou GPS.
Attaquons sans plus tarder.
Commencez par définir un nouveau projet basé sur le modèle Single View Application
et donnez-lui le nom « ouSuisJe ». Toutes les méthodes relatives à la géolocalisation se trouvant dans le framework CoreLocation
, la première étape va consister à ajouter ce framework à l'application.
Comme à la figure suivante, cliquez sur la première icône affichée dans le volet de navigation (1) et sélectionnez l'onglet Build Phases
dans la zone d'édition (2). Développez l'entrée Link Binary With Libraries
(3). Cliquez sur l'icône +
(4), sélectionnez le framework CoreLocation.framework
et cliquez sur Add
(5).

Nous allons afficher les coordonnées du device dans un Label
. Pour ce faire, cliquez sur MainStoryboard.storyboard
dans le volet de navigation (1) et ajoutez un Label
à la vue de l'application (2), comme à la figure suivante. Agrandissez ce contrôle et sélectionnez Show the Attributes inspector
dans le volet des utilitaires (3). Affectez la valeur « Recherche de la position en cours » à la propriété Text
(4) et la valeur « 10 » à la propriété Lines
(5).

Pourquoi affecter la valeur 10
à la propriété Lines
du Label
?
Ce Label
va être utilisé pour afficher des informations relatives à la position du device. La méthode utilisée pour obtenir ces informations est très « verbeuse ». C'est la raison pour laquelle autant de lignes sont attribuées au Label
. Si vous limitez la taille du Label
à deux ou trois lignes seulement, l'information affichée a toutes les chances d'être tronquée !
Cliquez sur l'icône Show the Assistant editor
dans la barre d'outils. Contrôle-glissez-déposez le Label
juste au-dessus du @end
final et définissez l'outlet maPosition
pour le Label
.
Cliquez sur ViewController.h
dans le volet de navigation et ajoutez une instruction #import
au fichier d'en-têtes pour faire référence au framework CoreLocation
:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
...
Comme l'indique la documentation Apple, les informations de géolocalisation sont obtenues à travers la classe CLLocationManager
. Cette dernière est accessible à travers le protocole CLLocationManagerDelegate
. Vous allez donc devoir implémenter ce protocole dans le code de l'application.
Cliquez sur ViewController.h
dans le volet de navigation et ajoutez le protocole dans la déclaration de l'interface :
@interface ViewController : UIViewController <CLLocationManagerDelegate>
Définissez ensuite la variable d'instance locationManager
de classe CLLocationLManager
:
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
Comme nous le verrons un peu plus loin, c'est par l'intermédiaire de cette variable d'instance que le processus de géolocalisation sera lancé.
Le fichier d'en-têtes doit maintenant avoir l'allure suivante :
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UILabel *maPosition;
@end
Il est temps de passer à la définition du code. Cliquez sur ViewController.m
dans le volet de navigation et complétez la méthode viewDidLoad
comme suit :
(void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled])
{
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 100.0f;
[locationManager startUpdatingLocation];
}
}
N'ayez crainte, nous allons passer en revue toutes ces instructions.
Ligne 4, l'objet locationManager
est défini et initialisé :
locationManager = [[CLLocationManager alloc] init];
L'instruction de la ligne 5 teste si le service de géolocalisation est disponible et activé :
if ([CLLocationManager locationServicesEnabled]) {
Cette instruction est nécessaire : en effet, si le mode « Avion » est activé ou si les périphériques de géolocalisation ne sont pas en mesure de fournir des informations, il est inutile de chercher à en obtenir.
L'instruction de la ligne 7 affecte la valeur self
à la propriété delegate
de l'objet locationManager
afin d'indiquer que les événements relatifs à la géolocalisation doivent être traités dans ViewController.m
:
locationManager.delegate = self;
L'instruction de la ligne 8 définit la précision désirée :
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
La constante utilisée (kCLLocationAccuracyBest
) demande la meilleure précision possible. Si vous le souhaitez, vous pouvez utiliser une autre précision. Par exemple, kCLLocationAccuracyHundredMeters
pour obtenir une précision de cent mètres.
Consultez la section intitulée « Core Location Constants Reference » dans la documentation Apple pour prendre connaissance de toutes les constantes disponibles.
Mais pourquoi ne pas utiliser systématiquement la meilleure précision possible ?
Cela semble en effet une bonne solution… si la batterie du device est entièrement chargée. Dans le cas contraire, la géolocalisation fonctionnera certes d'une façon très précise, mais pour une durée assez courte. En effet, précision et consommation en énergie vont de pair. À vous de trouver le juste milieu en fonction de ce que doit faire votre application…
La ligne 9 définit la distance de déplacement minimale du device avant qu'une mise à jour de la position ne soit effectuée. Dans cet exemple, il faudra que le device se déplace de 100 mètres pour qu'une notification de changement de position soit faite :
locationManager.distanceFilter = 100.0f;
La ligne 10 exécute la méthode startUpdatingLocation
. En d'autres termes, elle demande au device de mettre à jour de façon régulière ses coordonnées géographiques, en accord avec les paramètres définis précédemment (précision et déplacement minimum pour mise à jour) :
[locationManager startUpdatingLocation];
L'implémentation du protocole CLLocationManagerDelegate
et la définition de l'objet locationManager
ne sont pas suffisantes. Vous devez également faire appel aux méthodes :
locationManager:didUpdateToLocation:fromLocation:
pour savoir si une nouvelle position est disponible ;locationManager:didFailWithError:
qui indique, le cas échéant, qu'aucune position ne peut être déterminée pour le device.
Ces deux méthodes sont abondamment documentées dans la documentation Apple qui donne, entre autres choses, les en-têtes de ces deux fonctions. Ajoutez ces en-têtes dans le fichier ViewController.m
et complétez-les comme suit :
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
maPosition.text = [newLocation description];
}
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
maPosition.text = [error description];
}
Chaque fois qu'une mise à jour de la position du device est générée, la méthode locationManager:didUpdateToLocation:fromLocation:
est exécutée. Le nouvel emplacement ([newLocation description]
) est alors affiché dans le Label
:
maPosition.text = [newLocation description];
Lorsque le système de géolocalisation du device n'est pas en mesure de donner des coordonnées géographiques, la méthode locationManager:didFailWithError:
est exécutée. Le message d'erreur ([error description];
) est alors affiché dans le Label (maPosition.text
) :
maPosition.text = [error description];
Allez-y, lancez l'application, vous l'avez bien mérité !
Je suppose que vous testez cette application dans le simulateur iOS. Dans ce cas, une boîte de dialogue devrait s'afficher, comme à la figure suivante.

Validez en cliquant sur OK
. Regardez la figure suivante, le résultat est plutôt fantaisiste.

Pour avoir des résultats cohérents, une seule solution : testez l'application sur un device !
Le code de l'application se trouve dans le dossier ouSuisJe
.
ViewController.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UILabel *maPosition;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize maPosition;
(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
(void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 1000.0f;
[locationManager startUpdatingLocation];
}
}
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
maPosition.text = [newLocation description];
}
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
maPosition.text = [error description];
}
(void)viewDidUnload
{
[self setMaPosition:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
Vitesse
En utilisant le même principe que dans l'application précédente, et en y ajoutant la propriété speed
de l'objet locationManager
, il est possible d'obtenir la vitesse instantanée du device.
Définissez un nouveau projet basé sur le modèle Single View Application
et donnez-lui le nom « vitesse ». Ajoutez le framework CoreLocation
dans ce projet et implémentez le protocole CLLocationManagerDelegate
comme vous l'avez fait dans la section précédente. Insérez un Label
dans la vue du projet et attachez-lui l'outlet laVitesse
.
Copiez-collez les en-têtes du fichier ViewController.h
du projet ouSuisJe
dans le fichier ViewController.h
du projet vitesse
. Voici ce que vous devriez obtenir :
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UILabel *laVitesse;
@end
Copiez-collez la méthode viewDidLoad
du fichier ViewController.m
du projet ouSuisJe
dans le fichier ViewController.m
du projet vitesse
.
(void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled])
{
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10.0f;
[locationManager startUpdatingLocation];
}
}
Copiez-collez la méthode locationManager:didUpdateToLocation:fromLocation:
du fichier ViewController.m
du projet ouSuisJe
dans le fichier ViewController.m
du projet vitesse
, puis modifiez-la comme suit :
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (newLocation.speed > 0.0)
{
NSString* vitesseString = [NSString stringWithFormat:@"Votre vitesse instantanée : %0.1f m/s",newLocation.speed];
laVitesse.text = vitesseString;
}
}
Rappelons que cette méthode est exécutée chaque fois que le device change de position, en accord avec les paramètres de précision et de « distance de bougé » définis dans l'objet locationManager
.
Examinons les nouvelles instructions de cette méthode.
La condition ligne 5 teste si la vitesse instantanée est supérieure à zéro, c'est-à-dire si le device est en mouvement :
if (newLocation.speed > 0.0)
Dans ce cas, la vitesse instantanée doit être affichée dans le Label laVitesse
. Étant donné que la propriété speed
est un nombre flottant et que la propriété text
du Label
est de type NSString
, il est nécessaire d'effectuer une conversion de type. C'est le but de la première instruction qui suit le if
:
NSString* vitesseString = [NSString stringWithFormat:@"Votre vitesse instantanée : %0.1f m/s",newLocation.speed];
Le NSString vitesseString
est défini (NSString* vitesseString
), puis il est initialisé avec un String
([NSString stringWithFormat:@"…"]
) obtenu en concaténant une chaîne de caractères (« Votre vitesse instantanée : »), la vitesse instantanée flottante (%0.1f
) et une autre chaîne de caractères (« m/s »).
Il suffit maintenant d'afficher cette chaîne dans le label laVitesse
en agissant sur sa propriété text
:
laVitesse.text = vitesseString;
Modifiez également la propriété distanceFilter
de l'objet locationManager
et affectez-lui la valeur 10.0f
.
Enfin, copiez-collez la méthode locationManager:didFailWithError:
présente dans le fichier ViewController.m
du projet ouSuisJe
dans le fichier ViewController.m
du projet vitesse
, puis modifiez-la comme suit :
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
laVitesse.text = [error description];
}
Il ne vous reste plus qu'à uploader ce projet sur votre device et à aller le tester sur le terrain.
Ce projet se trouve dans le dossier vitesse
.
ViewController.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UILabel *laVitesse;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize laVitesse;
(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
(void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10.0f;
[locationManager startUpdatingLocation];
}
}
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (newLocation.speed > 0.0)
{
NSString* vitesseString = [NSString stringWithFormat:@"Votre vitesse instantanée : %0.1f m/s",newLocation.speed];
laVitesse.text = vitesseString;
}
}
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
laVitesse.text = [error description];
}
(void)viewDidUnload
{
[self setLaVitesse:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
Géolocalisation inversée
Le processus de « géolocalisation inversée » consiste à trouver l'adresse qui correspond à un couple longitude/latitude. Le framework MapKit
donne accès à une classe de géolocalisation inversée liée à Google Maps.
Le principe en est détaillé ci-après.
Implémentation du protocole
CLLocationManagerDelegate
, définition de l'objetlocationManager
et utilisation de la méthodeImplémentation du protocole
MKReverseGeocoderDelegate
et utilisation des coordonnées locales obtenues dans l'étape 1 pour trouver l'adresse correspondante via la méthodeAffichage de l'adresse dans un contrôle
UITextView
déposé dans la vue de l'application.
locationManager:didUpdateToLocation:fromLocation:
pour obtenir la position du device. Cette technique a été décrite dans la première section de ce chapitre.
reverseGeocoder: geocoder didFindPlacemark:placemark
Commencez par définir une nouvelle application basée sur le modèle Single View Application
et donnez-lui le nom « geolocalisationInverse ». Cette application va utiliser les frameworks CoreLocation
(pour trouver la longitude et la latitude du device) et MapKit
(pour effectuer la géolocalisation inversée). La première étape va donc consister à ajouter ces frameworks à l'application.
Cliquez sur la première icône affichée dans le volet de navigation.
Sélectionnez l'onglet
Build Phases
dans la zone d'édition.Développez l'entrée
Link Binary With Libraries
.Cliquez sur l'icône
+
, sélectionnez le frameworkCoreLocation.framework
et cliquez surAdd
.Cliquez sur l'icône
+
, sélectionnez le frameworkMapKit.framework
et cliquez surAdd
.
Cliquez sur MainStoryboard.storyboard
dans le volet de navigation et ajoutez un contrôle UITextView
à la vue de l'application.
Cliquez sur l'icône Show the Assistant editor
dans la barre d'outils et contrôle-glissez-déposez le contrôle de la zone d'édition dans le fichier d'en-têtes, juste au-dessus du @end
final. Définissez l'outlet ladresse
pour ce contrôle.
Vous allez maintenant modifier le fichier d'en-têtes. Ajoutez deux instructions #import
pour accéder aux framework MapKit
et CoreLocation
:
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
...
Ajoutez les protocoles MKReverseGeocoderDelegate
et CLLocationManagerDelegate
dans la définition de l'interface et définissez la variable d'instance locationManager
de type CLLocationManager
:
@interface geolocalisationInverseViewController : UIViewController <MKReverseGeocoderDelegate, CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
Le fichier ViewController.h
doit maintenant avoir l'allure suivante :
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <MKReverseGeocoderDelegate, CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UITextView *ladresse;
@end

Vous allez maintenant modifier le code de l'application. Cliquez sur ViewController.m
.
Votre première action va consister à lancer une géolocalisation en agissant sur la méthode viewDidLoad
:
(void)viewDidLoad
{
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10.0f;
[locationManager startUpdatingLocation];
}
[super viewDidLoad];
}
Jusqu'ici, rien de nouveau. Si nécessaire, reportez-vous à la première section de ce chapitre pour avoir des explications détaillées sur ce code.
Si une erreur se produit pendant la tentative de géolocalisation, la méthode locationManager:didFailWithError
est exécutée. Le message d'erreur correspondant ([error description]
) est alors affiché dans le TextView
(ladresse.text
) :
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
ladresse.text = [error description];
}
Si la position du device est identifiée, la méthode
locationManager:didUpdateToLocation:fromLocation:
est exécutée. Définissez cette méthode et complétez-la comme suit :
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
MKReverseGeocoder* geocoder = [[MKReverseGeocoder alloc] initWithCoordinate: newLocation.coordinate];
geocoder.delegate = self;
[geocoder start];
}
Cette méthode définit l'objet geocoder
de type MKReverseGeocoder
et l'initialise avec les coordonnées géographiques retournées à la méthode didUpdateTo
:
MKReverseGeocoder* geocoder = [[MKReverseGeocoder alloc] initWithCoordinate: newLocation.coordinate];
L'instruction suivante indique que la gestion des événements (delegate
) liés à l'objet geocoder
(c'est-à-dire à la géolocalisation inversée) se fera dans la classe courante :
geocoder.delegate = self;
Enfin, la dernière instruction lance le processus de géolocalisation inversée :
[geocoder start];
Si une erreur se produit pendant le processus de géolocalisation inversée, la méthode reverseGeocoder: didFailWithError
est exécutée. Le message d'erreur correspondant ([error description]
) est alors affiché dans le TextView
(ladresse.text
) :
(void) reverseGeocoder: (MKReverseGeocoder*) geocoder didFailWithError:(NSError *)error
{
ladresse.text = [error description];
}
Si une adresse a pu être associée au couple longitude/latitude du device, la méthode reverseGeocoder: didFindPlacemark
est exécutée. Complétez cette méthode comme suit :
(void)reverseGeocoder:(MKReverseGeocoder*) geocoder didFindPlacemark:(MKPlacemark *)placemark
{
ladresse.text = [placemark.addressDictionary description];
}
L'unique instruction de cette méthode affiche l'adresse complète dans le contrôle TextView
.
Il ne vous reste plus qu'à uploader cette application sur votre device et à la tester en vous baladant près de chez vous. Vous devriez obtenir quelque chose comme la figure suivante.

Le code de l'application se trouve dans le dossier geolocalisationInverse
.
ViewController.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController : UIViewController <MKReverseGeocoderDelegate, CLLocationManagerDelegate>
{
CLLocationManager* locationManager;
}
@property (weak, nonatomic) IBOutlet UITextView *ladresse;
@end
ViewController.m
#import "ViewController.h"
@implementation ViewController
@synthesize ladresse;
(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
(void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = 10.0f;
[locationManager startUpdatingLocation];
}
}
(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
ladresse.text = [error description];
}
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
MKReverseGeocoder* geocoder = [[MKReverseGeocoder alloc] initWithCoordinate: newLocation.coordinate];
geocoder.delegate = self;
[geocoder start];
}
(void)reverseGeocoder:(MKReverseGeocoder*) geocoder didFindPlacemark:(MKPlacemark *)placemark
{
ladresse.text = [placemark.addressDictionary description];
}
(void)viewDidUnload
{
[self setLadresse:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
(void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
(void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
En résumé
Le framework
CoreLocation
permet de géolocaliser un device, mais aussi de calculer la vitesse de déplacement du device et de transformer un couple longitude/latitude en une adresse physique.Pour géolocaliser un device, vérifiez que le service de géolocalisation est disponible et activé, paramétrez la précision et mettez à jour les données de géolocalisation.
Pour calculer la vitesse instantanée d'un device, utilisez le principe de la géolocalisation et ajoutez-y la propriété
speed
de l'objetlocationManager
.Le processus de « géolocalisation inversée » consiste à trouver l'adresse qui correspond à un couple longitude/latitude. Le framework
MapKit
donne accès à une classe de géolocalisation inversée liée à Google Maps. Pour l'utiliser, vous définirez un objet de classeMKReverseGeocoder
et vous lui appliquerez la méthodestart
.