4
10 fév 2010



Introduction


L'affichage d'une carte Google Maps dans une application pour iPhone est assez similaire à celui sur Android. Il suffit de créer un projet, de déclarer une MapView et de la centrer avec le bon niveau de zoom.

Préparation du projet


Evidemment pour mettre en oeuvre ce tutoriel, il est nécessaire de posséder un Mac, car l'outil de développement pour iPhone s'installe exclusivement sur cette plateforme. Cet outil se nomme XCode, on le trouve sur cette page. Une fois installé , créez un nouveau projet pour iPhone de type Window based application ; il s'agit d'une version brute de projet, sans template en tout genre. Cela nous permettra de mieux comprendre les tâches à effectuer.


Pour utiliser les fonctionnalités des cartes dans une application iPhone, il faut ajouter le framework MapKit au projet :


Un peu de code


Nous aurons dans ce projet, que j'ai appelé MapView, deux classes importantes MapViewAppDelegate qui lance l'appli et donne la main au controleur de vue MapViewController. Ces fichiers ont l'extension .m, les .h étant leur déclaration.
Voici le fichier MapViewAppDelegate.h qui declare une fenêtre seulement :

@interface MapViewAppDelegate : NSObject
{
UIWindow *window;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

et voici le fichier MapViewAppDelegate.m

#import "MapViewAppDelegate.h"
#import "MapViewController.h"

@implementation MapViewAppDelegate

@synthesize window ;
MapViewController *mp ;

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
mp = [[MapViewController alloc] initWithNibName:nil bundle:nil];

[window addSubview:mp.view];
[window makeKeyAndVisible];
}

- (void)dealloc
{
[mp release];
[window release];
[super dealloc];
}

@end

On voit que dans la méthode applicationDidFinishLaunching on ajoute la vue du controleur MapViewController à la fenêtre principale.
Maintenant voyons la classe qui affiche la carte.
Dans MapviewController.h, on déclare hériter de MKMapViewDelegate et on déclare un objet MapView :

#import

@interface MapViewController : UIViewController
{
MKMapView *mapView;
}

@property (nonatomic, retain) IBOutlet MKMapView *mapView;

@end

Passons à la classe maintenant :

#import "MapViewController.h"

@implementation MapViewController

@synthesize mapView;

- (void)viewDidLoad {
[super viewDidLoad];
mapView.showsUserLocation = YES;
mapView =[[MKMapView alloc] initWithFrame:self.view.bounds];
mapView.mapType=MKMapTypeStandard;
mapView.delegate = self ;
mapView.zoomEnabled = TRUE ;
MKCoordinateRegion region ;
MKCoordinateSpan span;
span.latitudeDelta=0.1;
span.longitudeDelta=0.1;
CLLocationCoordinate2D location= mapView.userLocation.coordinate ;
location.latitude = 43.578059;
location.longitude = 1.40307;
region.span=span;
region.center=location;
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
[self.view insertSubview:mapView atIndex:0];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}

- (void)viewDidUnload {

self.mapView = nil;
}

- (void)dealloc {
[mapView release];
[super dealloc];
}

@end

Tout se passe dans la méthode viewDidLoad. La syntaxe est assez claire : on initialise des attributs de la carte, on crée une Region à partir de coordonnées GPS et avec une taille (span, niveau de zoom de base) puis on affiche cette MapView.

et voici le résultat :

Conclusion


Nous venons donc de créer une application avec une carte Google Maps intégrée. Ce n'est pas trés compliqué, hormis le fait de jongler avec multiples langages, mais les principes restent les mêmes.


Auteur : Loïc - loic.goblet [ at ] gmail.com

A propos de l'auteur: 

Commentaires

Bonjour,

Je sais que votre post commence à dater un peu, mais il reste néanmoins très intéressant pour moi !

J'ai suivi à la lettre votre tutoriel, mais lorsque je compile et j'exécute grâce au simulateur iPhone, l'application se ferme aussitôt.. Si je click sur l'icône, toujours dans le simulateur, elle s'ouvre puis se ferme sans que rien ne se passe...

Avez-vous déjà rencontré un problème de ce genre avec cette application ?

Merci beaucoup pour votre aide et votre travail.

Bien cordialement

Edouard Pagnier

Bonjour,

Je n'ai pas rencontré ce genre de problème avec cette application en particulier. Mais il est vrai qu'un simple oubli dans le code peut faire planter une application iPhone très rapidemment. Souvent, la lecture des messages dans la console permet de savoir ce qu'il s'est passé. Essayez aussi une analyse de code par xCode('compile and analyze').

Cordialement,
Loïc Goblet

Merci pour cet exemple, j'ai essayé et il a marché. une question:
est-ce que vous savez comme trouver le geocoding, ca veut dire la localisation de l'utilisateur qui possede l'iphone? Je voudrais faire un petit application qui me trouverait les club plus proche de mon geocoding, donc a partir de mes coordonnes.

Merci en avance,
dani

Bonjour,

il suffit d'utiliser le framework CoreLocation et se conformer au protocole CLLocationManagerDelegate. Avec un objet CLLocationManager, vous pourrez avoir accès aux changements de position de votre iPhone.
Le lien suivant décrit les différentes méthodes de CLLocationManager : ici.
Vous trouverez aussi des exemples fonctionnels sur cette page.