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

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&#39" (Créer un projet Xcode).

4f1ecee473937c7b.png

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&#39" (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.

72fbf25cb2db22ad.png

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&#39", comme suit:

789c5bc62817f68a.png

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.

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

19d62f34c08e646c.png

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.

8844d861f63c61aa.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 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:

C224c920ab3f1ef.png

Sélectionnez-la pour afficher l'éditeur de fichiers .plist.

859ca56f3b19da5.png

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&#39" dans ce champ.

9fb225d6f5508794.png

Appuyez sur Entrée pour ajouter la touche. Ensuite, double-cliquez sur la colonne "Value" (Valeur) de cette clé, puis ajoutez une chaîne:

5aefeb184187aa58.png

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.

352af28b970d9e2.png

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.

Adec7051ae949531.png

Dans la scène View Controller sur le côté gauche, assurez-vous que l'option "View&#39" (Affichage) est sélectionnée:

E4827b92b5861e3e.png

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:

F8a9457772358069.png

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.

A4abacf00d8888fe.png

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:

e92dcc4ceea20a61.png

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:

D42f0fcc18b84703.png

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:

A44b7888ed0f63b.png

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.

bbbe0b8820c8a913.png

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.

Bbbbaace7e68f186.png

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

Dcb1ce091d780f56.png

Pendant ce temps, l'emplacement est mis à jour, et les trajets probables sont simulés.

579e3eeb2321ae03.png

Et voilà ! Vous avez réussi à accéder aux informations sur le lieu actuelles à l'aide de l'API Google Places sur iOS.