À propos de cet atelier de programmation
1. Avant de commencer
Avant de commencer à coder, vous devez configurer certains prérequis.
Xcode
Ce tutoriel utilise l'outil Xcode d'Apple, ainsi que le langage Objective-C, pour créer une application iOS simple qui s'exécute dans un émulateur. Vous n'avez pas besoin d'un appareil physique. Vous pouvez obtenir Xcode à l'adresse https://developer.apple.com/xcode/
CocoaPods
Le SDK Places pour iOS est disponible en tant que pod CocoaPods. CocoaPods est un outil de gestion des dépendances Open Source pour les projets Swift et Objective-C. Si vous n'avez pas encore installé cet outil, vous devrez l'installer avant de continuer. Vous pouvez l'installer à partir du terminal comme suit:
sudo gem install cocoapods
Pour en savoir plus sur CocoaPods, consultez le guide de démarrage de CocoaPods.
Installing the SDK
Pour installer le SDK, vous devez créer un fichier Podfile dans le répertoire de votre projet, que CocoaPods utilisera pour télécharger et configurer les dépendances requises. Le plus simple est alors de créer un projet dans Xcode, d'y ajouter un Podfile et d'y installer les pods.
Ouvrez Xcode. L'écran "Welcome to Xcode'" (Bienvenue dans Xcode) s'affiche. Sélectionnez "Create a new Xcode project'" (Créer un projet Xcode).
Sur l'écran suivant, vous serez invité à fournir un modèle pour votre nouveau projet. Sélectionnez "Single View Application" (Application unique) pour iOS, puis appuyez sur "Next'" (Suivant).
Lorsque vous êtes invité à renseigner le nom du produit, vous pouvez choisir tout ce que vous voulez, mais n'oubliez pas de noter l'identifiant de groupe généré pour vous. Vous en aurez besoin plus tard.
Appuyez sur "Suivant" pour créer le projet. Notez le répertoire dans lequel il est créé. Fermez Xcode et, dans la section Terminal, accédez à ce répertoire.
À l'aide de Terminal, saisissez la commande suivante:
pod init
Un fichier nommé Podfile sera créé pour vous. Modifiez-le pour ajouter un pod à GoogleMaps comme suit:
target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end
Enregistrez-le, puis fermez Xcode. Assurez-vous de le fermer, car à l'étape suivante, vous allez modifier le projet sous-jacent. Vous ouvrirez un autre fichier de projet une fois l'opération terminée, et il est assez fréquent qu'un développeur ne confonde pas la procédure à suivre s'il ne ferme pas Xcode auparavant. Dans un terminal, accédez maintenant au répertoire de votre projet et exécutez "pod install'", comme suit:
Une fois que vous avez terminé, les pods sont installés et un nouveau fichier .xcworkspace est créé. À partir de maintenant, utilisez cette option pour le projet. Mais avant de coder, vous aurez besoin d'une clé API.
2. Obtenir votre clé API
Pour l'étape suivante, activez le SDK Maps pour iOS.
Configurer Google Maps Platform
Si vous ne disposez pas encore d'un compte Google Cloud Platform et d'un projet pour lequel la facturation est activée, consultez le guide Premiers pas avec Google Maps Platform pour savoir comment créer un compte de facturation et un projet.
- Dans Cloud Console, cliquez sur le menu déroulant des projets, puis sélectionnez celui que vous souhaitez utiliser pour cet atelier de programmation.
- Activez les API et les SDK Google Maps Platform requis pour cet atelier de programmation dans Google Cloud Marketplace. Pour ce faire, suivez les étapes indiquées dans cette vidéo ou dans cette documentation.
- Générez une clé API sur la page Identifiants de Cloud Console. Vous pouvez suivre la procédure décrite dans cette vidéo ou dans cette documentation. Toutes les requêtes envoyées à Google Maps Platform nécessitent une clé API.
3. Créer l'application API Places
Maintenant que vous avez créé un projet de console et que vous y avez activé l'API Places, vous pouvez maintenant commencer à coder votre première application API Places.
Au début de l'installation des fichiers du pod, un fichier .xcworkspace a été créé pour vous. Ouvrez le fichier en double-cliquant dessus.
Vous remarquerez que l'explorateur de projets comporte un nouveau dossier nommé "Pods'". Si cela a fonctionné, un dossier Google Maps contenant les frameworks s'affiche.
4. Modifiez le fichier Info.plist.
Lorsque vous exécutez l'application pour la première fois, iOS affiche une boîte de dialogue invitant l'utilisateur à autoriser l'accès aux services de localisation. Cette boîte de dialogue fournira une chaîne que vous définirez et vous la saisirez dans le fichier Info.plist. Si cette chaîne n'est pas présente, la boîte de dialogue ne s'affiche pas, et votre application ne fonctionne pas.
Vous trouverez le fichier Info.plist dans l'explorateur de projets:
Sélectionnez-la pour afficher l'éditeur de fichiers .plist.
Passez la souris sur l'un des éléments pour afficher l'icône "+". Appuyez dessus pour accéder à une nouvelle entrée. Saisissez la valeur "NSLocationAlwaysUsageDescription'" dans ce champ.
Appuyez sur Entrée pour ajouter la touche. Ensuite, double-cliquez sur la colonne "Value" (Valeur) de cette clé, puis ajoutez une chaîne:
Pour en savoir plus sur cette chaîne, consultez la documentation Apple destinée aux développeurs.
5. Modifier votre délégué d'application
Dans l'explorateur de projets, recherchez et ouvrez AppDelegate.m. Vous l'utiliserez pour ajouter votre clé API.
En haut du fichier, ajoutez ce qui suit immédiatement sous la ligne #import:
@import GoogleMaps;
Ensuite, ajoutez le code suivant dans la fonction didFinishLaunchingWithOptions: à la ligne "return YES'".
[GMSServices provideAPIKey:@"<Add your API Key>"];
Veillez à utiliser la clé API générée précédemment.
6. Modifier le fichier de storyboard
Dans l'explorateur de projets, ouvrez le fichier Main.storyboard. Assurez-vous que la barre latérale est active en appuyant sur le bouton de la barre latérale en haut à droite.
Au bas de la barre latérale, recherchez ensuite la commande de libellé en vous assurant que la bibliothèque d'objets est sélectionnée.
Dans la scène View Controller sur le côté gauche, assurez-vous que l'option "View'" (Affichage) est sélectionnée:
Glissez-déposez ensuite sept libellés sur la vue. Classez-les comme indiqué ci-dessous. Veillez à faire glisser leur taille pour qu'elle corresponde aux éléments affichés. Vous pouvez modifier le texte du libellé en double-cliquant dessus et en saisissant la valeur requise:
Pour le libellé le plus bas (le plus grand), accédez à l'éditeur de propriétés et assurez-vous qu'il est défini sur 0 ligne (valeur par défaut : 1). Cela lui permettra d'afficher plusieurs lignes.
7. Créer des sorties pour les valeurs
Pour les trois libellés "value", vous devez créer une prise. Vous pourrez ainsi modifier leurs valeurs à l'aide de code. Pour cela, vous devez d'abord activer l'éditeur de l'Assistant. Pour cela, fermez la barre latérale des propriétés en cliquant sur le bouton correspondant. (Ce bouton a été affiché à l'étape précédente)
Sélectionnez ensuite le bouton Assistant. Il s'agit du double cercle affiché ici:
Assurez-vous qu'il affiche le fichier ViewController.h. Si ce n'est pas le cas, vous pouvez le faire à l'aide de l'éditeur situé en haut de la fenêtre de l'Assistant:
Ensuite, lorsque vous maintenez la clé de contrôle enfoncée, faites glisser chaque libellé et déposez-le sous la ligne @interface dans le fichier ViewController.h de l'Assistant. Une boîte de dialogue s'affiche, vous demandant quel type de connexion vous souhaitez établir:
Assurez-vous que les paramètres sont affichés (connexion: sortie, type: UILabel ; stockage: faible), puis attribuez un nom à chaque élément. Pour les besoins de cet atelier de programmation, j'ai appelé les valeurs "Longitude", "latitude" et "Altitude", lblLongitude, lblLatitude et lblAltidude. Faites également glisser le grand libellé du bas vers le bas et appelez-le lblPlaces.
Lorsque vous avez terminé, votre fichier ViewController.h doit se présenter comme suit:
#import <UIKit/UIKit.h>
@import GoogleMaps;
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;
@end
8. Modifier le fichier d'en-tête pour l'emplacement et les API client Google
Avant les dernières étapes, où vous créez l'application pour utiliser l'API Places, vous devez configurer quelques variables supplémentaires dans le fichier d'en-tête (ViewController.h). Il s'agit du gestionnaire de zones géographiques principal et d'un objet "Zone géographique principale" :
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
Vous aurez également besoin d'un client API Google:
@property GMSPlacesClient *placesClient;
Enfin, vous devez mettre à jour le fichier d'en-tête afin que la classe implémente CLLocationManagerDelegate:
@interface ViewController : UIViewController<CLLocationManagerDelegate>
Lorsque vous avez terminé, votre fichier d'en-tête doit se présenter comme suit:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>
@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;
@property GMSPlacesClient *placesClient;
@end
9. Modifier votre contrôleur de vue
La première étape consiste à modifier la fonction view DidLoad pour initialiser le gestionnaire de positions, à demander l'autorisation d'accès à la position par l'utilisateur, puis à démarrer le gestionnaire de positions afin qu'il effectue le suivi de la position actuelle. Vous allez également initialiser le client API Google Places.
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
// Or [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
self.locationManager.delegate = self;
self.location = [[CLLocation alloc] init];
self.placesClient = [GMSPlacesClient sharedClient];
}
10. Gérer les mises à jour de la position
Le gestionnaire d'établissements rappelle à votre contrôleur de vue des mises à jour de position en appelant la fonction DidUpdateLocations. Vous devrez ajouter ceci à votre ViewController.m. La fonction ressemble à ceci:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
// Enter code here
}
Cette fonction doit effectuer plusieurs opérations.
Tout d'abord, il mettra en cache l'emplacement avec le dernier reçu:
self.location = locations.lastObject;
Mettez ensuite à jour les trois libellés de latitude, de longitude et d'altitude:
self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
Vous allez ensuite appeler l'API Places à l'aide du client Places. Pour ce faire, spécifiez la fonction de rappel. Elle obtient la liste des probabilités de lieu. L'API Places détermine la probabilité que vous vous trouviez à un lieu donné en fonction de votre position. Il affiche le nom des lieux probables, avec une valeur comprise entre 0 et 1 indiquant la probabilité que vous soyez dans ce lieu.
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
Vous pouvez ensuite implémenter le rappel. Vous accédez alors à la liste des probabilités, qui ajoute des lieux et des probabilités pour ces lieux.
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
if (error != nil) {
NSLog(@"Current Place error %@", [error localizedDescription]);
return;
}
NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {
GMSPlace* place = likelihood.place;
NSLog(@"Current Place name %@ at likelihood %g", place.name,
likelihood.likelihood);
NSLog(@"Current Place address %@", place.formattedAddress);
NSLog(@"Current Place attributions %@", place.attributions);
NSLog(@"Current PlaceID %@", place.placeID);
[strPlaces appendString:place.name];
[strPlaces appendString:@" "];
[strPlaces appendFormat:@"%g",likelihood.likelihood];
[strPlaces appendString:@"\n"];
}
self.lblPlaces.text = strPlaces;
}];
Lorsque vous avez terminé, votre fonction DidUpdateLocations doit se présenter comme suit:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
self.location = locations.lastObject;
self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
NSLog(@"%@", self.location.description);
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
if (error != nil) {
NSLog(@"Current Place error %@", [error localizedDescription]);
return;
}
NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods)
{
GMSPlace* place = likelihood.place;
NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);
NSLog(@"Current Place address %@", place.formattedAddress);
NSLog(@"Current Place attributions %@", place.attributions);
NSLog(@"Current PlaceID %@", place.placeID);
[strPlaces appendString:place.name];
[strPlaces appendString:@" "];
[strPlaces appendFormat:@"%g",likelihood.likelihood];
[strPlaces appendString:@"\n"];
}
self.lblPlaces.text = strPlaces;
}];
}
Vous êtes prêt à exécuter votre application et à la tester.
11. Exécuter l'application dans l'émulateur
Vous pouvez exécuter l'application à l'aide du bouton "Run" (Exécuter) dans la barre de titre. Cela vous permet également de sélectionner le type d'exécution. Comme vous pouvez le voir ici, vous pouvez effectuer des tests sur l'iPhone 6 à l'aide de l'émulateur.
Lorsque vous appuyez sur le bouton "Exécuter", l'application est créée et lancée. La demande d'autorisation d'accès de l'application à la position, y compris la chaîne personnalisée que vous avez spécifiée précédemment, s'affiche.
La latitude et la longitude s'affichent alors. Pour modifier l'emplacement, sélectionnez le menu "Débogage", puis choisissez un emplacement. Par exemple, vous pouvez choisir l'option "Autoroute".
Pendant ce temps, l'emplacement est mis à jour, et les trajets probables sont simulés.
Et voilà ! Vous avez réussi à accéder aux informations sur le lieu actuelles à l'aide de l'API Google Places sur iOS.