Premiers pas avec le SDK Places pour iOS (Objective-C)

1. Avant de commencer

Avant de commencer à coder, vous devez configurer quelques 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'appareil physique. Vous pouvez obtenir Xcode sur https://developer.apple.com/xcode/.

CocoaPods

Le SDK Places pour iOS est disponible en tant que pod CocoaPods. CocoaPods est un outil Open Source de gestion des dépendances pour les projets Swift et Objective-C. Si vous ne disposez pas déjà de cet outil, vous devrez l'installer avant de continuer. Il peut être installé à 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. CocoaPods l'utilisera pour télécharger et configurer les dépendances requises. Le moyen le plus simple de procéder est de créer un projet dans Xcode, d'y ajouter un fichier Podfile et d'y installer les pods.

Ouvrez Xcode. L'écran "Bienvenue dans Xcode" s'affiche. Sélectionnez "Create a new Xcode project" (Créer un projet Xcode).

4f1ecee473937c7b.png

Sur l'écran suivant, vous serez invité à choisir un modèle pour votre nouveau projet. Sélectionnez "Single View Application" (Application à vue unique) pour iOS, puis appuyez sur "Next" (Suivant).

Lorsque vous êtes invité à saisir le nom du produit, vous pouvez choisir ce que vous voulez, mais veillez à noter l'identifiant du bundle qui est généré pour vous. Vous en aurez besoin ultérieurement.

72fbf25cb2db22ad.png

Appuyez sur "Suivant" pour créer le projet. Notez le répertoire dans lequel il est créé. Fermez Xcode et accédez à ce répertoire à l'aide du terminal.

Dans le terminal, saisissez la commande suivante :

pod init

Un fichier nommé "Podfile" sera créé pour vous. Modifiez-le pour ajouter un pod pour GoogleMaps, comme suit :

target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end

Enregistrez-le, puis fermez Xcode. Veillez à le fermer, car à l'étape suivante, vous allez modifier le projet sous-jacent. Une fois cette étape terminée, vous ouvrirez un autre fichier de projet. Il est assez courant qu'un développeur ne sache plus où se trouve chaque élément s'il n'a pas fermé Xcode auparavant. Maintenant, dans un terminal, accédez au répertoire de votre projet et exécutez "pod install" comme suit :

789c5bc62817f68a.png

Une fois cette opération terminée, les pods seront installés et un fichier .xcworkspace sera créé. Utilisez-le pour le projet à partir de maintenant. Toutefois, 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.

  1. Dans Cloud Console, cliquez sur le menu déroulant des projets, puis sélectionnez celui que vous souhaitez utiliser pour cet atelier de programmation.

  1. 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.
  2. 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 dans la console et activé l'API Places, vous êtes prêt à commencer à coder votre première application API Places.

Lors de l'installation des fichiers de pod, un fichier .xcworkspace a été créé pour vous. Ouvrez-le en double-cliquant dessus.

19d62f34c08e645c.png

Vous remarquerez dans l'explorateur de projet qu'un nouveau dossier appelé "Pods" a été créé. Si l'opération a réussi, un dossier GoogleMaps contenant les frameworks s'affiche.

8844d861f64c61aa.png

4. Modifiez le fichier Info.plist.

Lorsque vous exécutez l'application pour la première fois, iOS affiche une boîte de dialogue demandant à l'utilisateur d'autoriser l'accès aux services de localisation. Cette boîte de dialogue affichera une chaîne que vous définissez et que vous placez dans le fichier Info.plist. Si cette chaîne n'est pas présente, la boîte de dialogue ne s'affichera pas et votre application ne fonctionnera pas.

Vous trouverez le fichier Info.plist dans l'explorateur de projets :

c224c920ab3f1ef.png

Sélectionnez-le pour afficher l'éditeur plist.

859ca56f3b19da5.png

Pointez sur l'un des éléments pour afficher l'icône "+". Appuyez dessus et une nouvelle entrée s'affiche. Saisissez la valeur "NSLocationAlwaysUsageDescription" dans cette zone.

9fb225d6f5508794.png

Appuyez sur Entrée pour ajouter la nouvelle clé. Double-cliquez ensuite sur la colonne "Valeur" de cette clé et ajoutez une chaîne :

5aefeb184187aa58.png

Pour en savoir plus sur cette chaîne, consultez la documentation Apple pour les développeurs ici.

5. Modifier votre délégué d'application

Dans l'explorateur de projet, recherchez et ouvrez AppDelegate.m. Vous l'utiliserez pour ajouter votre clé API.

En haut du fichier, ajoutez la ligne suivante immédiatement en dessous de la ligne #import :

@import GoogleMaps;

Ensuite, dans la fonction didFinishLaunchingWithOptions : ajoutez ce qui suit juste au-dessus de la ligne "return YES" :

[GMSServices provideAPIKey:@"<Add your API Key>"];

Veillez à utiliser la clé API que vous avez générée précédemment.

6. Modifier votre fichier 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.

352af28b970d9e2.png

Ensuite, en bas de la barre latérale, recherchez le contrôle du libellé en vous assurant que la bibliothèque d'objets est sélectionnée.

adec7051ae949531.png

Dans la scène du contrôleur de vue sur la gauche, assurez-vous que la vue est sélectionnée :

e4827b92b5861e3e.png

Faites ensuite glisser et déposer sept libellés dans la vue. Disposez-les comme indiqué ici. Veillez à faire glisser les tailles pour qu'elles correspondent à celles indiquées. Pour modifier le texte du libellé, double-cliquez dessus et saisissez la valeur requise :

f8a9457772358069.png

Pour le libellé le plus bas (le très grand), accédez à l'éditeur de propriétés et assurez-vous qu'il est défini sur 0 ligne (par défaut, il est défini sur 1). Cela lui permettra d'afficher plusieurs lignes.

a4abacf00d8888fe.png

7. Créer des sorties pour les valeurs

Pour les trois libellés de valeur, vous devrez créer un point de vente. Cela vous permettra de modifier leurs valeurs à l'aide de code. Pour ce faire, vous devez d'abord activer l'éditeur d'assistance. Pour ce faire, commencez par fermer la barre latérale des propriétés en cliquant sur son bouton pour la supprimer. (Ce bouton a été présenté à l'étape précédente.)

Sélectionnez ensuite le bouton de l'assistant (le double cercle, comme indiqué ci-dessous) :

e92dcc4ceea20a51.png

Assurez-vous qu'il affiche le fichier ViewController.h. Si ce n'est pas le cas, vous pouvez le modifier à l'aide de l'éditeur situé en haut de la fenêtre de l'assistant :

d42f0fcc18b84703.png

Ensuite, en maintenant la touche CONTROL 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 et vous demande le type de connexion que vous souhaitez établir :

a44b7888ed0f62b.png

Assurez-vous que les paramètres sont tels qu'indiqués (Connexion : Outlet ; Type : UILabel ; Stockage : Faible), puis donnez un nom à chacun d'eux. Pour les besoins de cet atelier de programmation, j'ai nommé les libellés de longitude, de latitude et d'altitude lblLongitude, lblLatitude et lblAltidude, respectivement. Faites également glisser le grand libellé depuis 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 les API de localisation et Google Client

Avant de passer aux étapes finales, où vous allez créer l'application pour utiliser l'API Places, vous devez configurer quelques variables supplémentaires dans le fichier d'en-tête (ViewController.h). Voici le gestionnaire Core Location et un objet Core Location :

@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;

Vous aurez également besoin d'un client d'API Google :

@property GMSPlacesClient *placesClient;

Enfin, vous devez mettre à jour le fichier d'en-tête pour 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 viewDidLoad pour initialiser le gestionnaire de localisation, demander l'autorisation de l'utilisateur pour accéder à la localisation et, enfin, démarrer le gestionnaire de localisation afin qu'il suive la position actuelle. Vous allez également initialiser le client de l'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 de localisation rappellera votre contrôleur de vue avec les mises à jour de localisation en appelant la fonction didUpdateLocations. Vous devrez ajouter cela à votre ViewController.m. La fonction se présente comme suit :

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    // Enter code here
}

Cette fonction devra effectuer plusieurs opérations.

Tout d'abord, il met en cache l'emplacement avec le dernier reçu :

self.location = locations.lastObject;

Ensuite, les trois libellés de latitude, longitude et altitude doivent être mis à jour :

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 qui récupérera la liste des probabilités des lieux. L'API Places détermine la probabilité que vous vous trouviez dans un lieu spécifique en fonction de votre position. Il renvoie le nom des lieux probables, ainsi qu'une valeur comprise entre 0 et 1 indiquant la probabilité que vous vous trouviez à cet endroit.

[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {

Vous pouvez ensuite implémenter le rappel. Cela itérera la liste des probabilités, en ajoutant 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;
}];

Une fois que 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 maintenant prêt à exécuter votre application et à la tester.

11. Exécuter l'application dans l'émulateur

Exécutez l'application à l'aide du bouton d'exécution dans la barre de titre. Cela vous permet également de sélectionner le type d'exécution. Comme vous pouvez le voir ici, je teste sur un iPhone 6 à l'aide de l'émulateur.

bbbe0b8820c8a913.png

Lorsque vous appuyez sur le bouton d'exécution, l'application est créée et lancée. La demande d'autorisation d'accès à la localisation s'affiche, y compris la chaîne personnalisée que vous avez spécifiée précédemment.

b9bb2ace7e68f186.png

Une fois cette opération effectuée, vos latitude et longitude sont mises à jour. Pour modifier la position, sélectionnez le menu "Déboguer", puis choisissez une position. Par exemple, vous pouvez choisir "Trajet sur autoroute".

dcb1ce091d780f56.png

Lorsque vous le faites, vous voyez la position et les lieux probables se mettre à jour, simulant ainsi le trajet sur l'autoroute.

649e3eeb2321ae03.png

Et voilà ! Vous avez réussi à accéder aux détails du lieu actuel à l'aide de l'API Google Places sur iOS.