• 20 heures
  • {0} Facile|{1} Moyenne|{2} Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

J'ai tout compris !

Mis à jour le 21/06/2013

Géolocalisation

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

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.

La latitude et la longitude permettent de déterminer avec précision un point sur la Terre

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).

Ajoutez le framework CoreLocation à l'application

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).

Nous allons afficher les coordonnées du device dans un Label

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.

Une boîte de dialogue s'affiche dans le simulateur

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

Le résultat de la géolocalisation 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.

  1. Implémentation du protocole CLLocationManagerDelegate, définition de l'objet locationManager et utilisation de la méthode

  2. - locationManager:didUpdateToLocation:fromLocation:

    pour obtenir la position du device. Cette technique a été décrite dans la première section de ce chapitre.

  3. Implémentation du protocole MKReverseGeocoderDelegate et utilisation des coordonnées locales obtenues dans l'étape 1 pour trouver l'adresse correspondante via la méthode

  4. - reverseGeocoder: geocoder didFindPlacemark:placemark
  5. Affichage de l'adresse dans un contrôle UITextView déposé dans la vue de l'application.

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.

  1. Cliquez sur la première icône affichée dans le volet de navigation.

  2. Sélectionnez l'onglet Build Phases dans la zone d'édition.

  3. Développez l'entrée Link Binary With Libraries.

  4. Cliquez sur l'icône +, sélectionnez le framework CoreLocation.framework et cliquez sur Add.

  5. Cliquez sur l'icône +, sélectionnez le framework MapKit.framework et cliquez sur Add.

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
Un panneau « Attention  » de couleur jaune est affiché dans la marge gauche du code

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.

Résultat de la géolocalisation inversée

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'objet locationManager.

  • 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 classe MKReverseGeocoder et vous lui appliquerez la méthode start.

Exemple de certificat de réussite
Exemple de certificat de réussite