Premiers pas avec le SDK Driver pour iOS

Le SDK Driver est une bibliothèque que vous intégrez dans votre application de pilote. Il est responsable de la mise à jour de Fleet Engine avec l'emplacement, l'itinéraire, la distance restante et l'heure d'arrivée prévue. Il s'intègre aussi au SDK Navigation, fournit des instructions de navigation détaillées au conducteur.

Configuration système minimale requise

  • L'appareil mobile doit exécuter iOS 14 ou une version ultérieure.
  • Xcode version 15 ou ultérieure.
  • Prérequis

    Ce guide part du principe que votre application implémente déjà la SDK Navigation, et que la Moteur de flotte est configuré et disponible. Toutefois, l'exemple de code fournit un exemple de configuration SDK Navigation :

    Vous devez également activer le SDK Maps pour iOS. dans votre projet Google Cloud et obtenir une clé API.

    Développement local

    Pour le développement en local, il suffit de se connecter avec le SDK Cloud :

    gcloud

    gcloud auth login
    

    L'adresse e-mail utilisée pour se connecter doit être membre du groupe Workspace.

    Automatisation (systèmes de compilation ou intégration continue)

    Configurez vos hôtes d'automatisation en fonction bonnes pratiques:

    • Si votre processus s'exécute dans un environnement Google Cloud, utilisez automatique la détection d'identifiants.

    • Sinon, stockez le fichier de clé du compte de service dans un emplacement sécurisé système de fichiers de l'hôte et définir GOOGLE_APPLICATION_CREDENTIALS variable d'environnement de façon appropriée.

    L'adresse e-mail du compte de service associée aux identifiants doit être membre de le groupe Workspace.

    Configuration du projet

    Gestionnaire de paquets Swift

    Pour installer le SDK Driver, utilisez Gestionnaire de paquets Swift. Pour ajouter le SDK, assurez-vous d'avoir supprimé toutes les dépendances existantes du SDK Driver.

    Pour ajouter le SDK à un projet nouveau ou existant, procédez comme suit:

    1. Ouvrez votre Xcode project ou workspace, puis accédez à File > (Fichier >) Ajouter des dépendances de packages
    2. Saisissez https://github.com/googlemaps/ios-driver-sdk comme URL, puis appuyez sur Entrée. pour extraire le package et cliquez sur « Ajouter un package ».
    3. Pour installer un version spécifique, définissez le champ Règle de dépendance sur l'une des les options basées sur les versions. Pour les nouveaux projets, nous vous recommandons de spécifier la dernière version et à l'aide de la colonne "Version exacte", . Une fois l'opération terminée, cliquez sur "Ajouter un package".
    4. Dans la fenêtre Choose Package Products (Sélectionner les produits du package), vérifiez que GoogleRidesharingDriver sera ajouté à votre main cible désignée. Une fois l'opération terminée, cliquez sur "Ajouter un package".
    5. Pour vérifier votre installation, accédez au volet General de votre cible. Les packages installés devraient s'afficher dans Frameworks, libraries, and Embedded Content (Cadres, bibliothèques et contenu intégré). Vous pouvez également afficher les "Dépendances des packages" de la section "Navigateur de projets" pour vérifier le package et sa version.

    Pour mettre à jour le package pour un projet existant, procédez comme suit:

    1. Si vous effectuez la mise à niveau à partir d'une version antérieure à la version 9.0.0,vous devez supprimer les dépendances suivantes: GoogleMapsBase, GoogleMapsCore et GoogleMapsM4B après la mise à niveau. Ne supprimez pas la dépendance pour GoogleMaps Pour en savoir plus, consultez les Notes de version de la version 9.0.0

      Dans les paramètres de configuration de votre projet Xcode, recherchez Frameworks, Bibliothèques, et les contenus intégrés. Utilisez le signe moins(-) pour supprimer le framework suivant:

      • GoogleMapsBase (uniquement pour les mises à niveau à partir de versions antérieures à la version 9.0.0)
      • GoogleMapsCore (uniquement pour les mises à niveau à partir de versions antérieures à la version 9.0.0)
      • GoogleMapsM4B (uniquement pour les mises à niveau à partir de versions antérieures à la version 9.0.0)
    2. Dans Xcode, accédez à Fichier > Packages > Update To Latest Package Versions" (Mise à jour vers les dernières versions du package).
    3. Pour vérifier votre installation, accédez à la section Package Dependencies (Dépendances des packages) du Project Navigator (Navigateur de projets). pour vérifier le package et sa version.
    <ph type="x-smartling-placeholder">

    Pour supprimer les dépendances existantes du SDK Driver ajoutées à l'aide de CocoaPods, procédez comme suit:

    1. Fermez votre espace de travail Xcode. Ouvrez le terminal et exécutez la commande suivante:
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. Supprimez Podfile, Podfile.resolved et les Xcode workspace si vous ne les utilisez pas pour d'autres produits que CocoaPods.

    Pour supprimer le SDK Driver installé manuellement, procédez comme suit:

    1. Dans les paramètres de configuration de votre projet Xcode, recherchez Frameworks, bibliothèques et contenus intégrés. Utilisez le signe moins(-) pour supprimer le framework suivant:

      • GoogleRidesharingDriver.xcframework
    2. Dans le répertoire de premier niveau de votre projet Xcode, supprimez le Lot GoogleRidesharingDriver.

    CocoaPods

    Pour configurer le SDK Driver à l'aide de CocoaPods, vous avez besoin des éléments suivants:

    • Outil CocoaPods: pour installer cet outil, ouvrez le terminal et exécutez la la commande suivante.
       sudo gem install cocoapods
    
    1. Créez un Podfile pour le SDK Driver et utilisez-le pour installer l'API. ses dépendances: créez un fichier nommé Podfile dans le répertoire de votre projet. Ce fichier définit les dépendances de votre projet. Modifiez le Podfile et ajoutez vos dépendances. Voici un exemple qui inclut les dépendances:

      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      

      Voici un exemple incluant les séries d'annonces alpha et bêta SDK Driver en tant que dépendances:

      source "https://cpdc-eap.googlesource.com/ridesharing-driver-sdk.git"
      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      
    2. Enregistrez le Podfile. Ouvrez un terminal et accédez au répertoire contenant le Podfile:

      cd <path-to-project>
      
    3. Exécutez la commande d'installation du pod. Les API spécifiées dans la section Podfile, ainsi que ses éventuelles dépendances.

      pod install
      
    4. Fermez Xcode, puis ouvrez (double-cliquez) le fichier .xcworkspace de votre projet. pour lancer Xcode. À partir de ce moment, vous devez utiliser .xcworkspace pour ouvrir le projet.

    Reportez-vous au document Premiers pas avec CocoaPods pour en savoir plus plus de détails.

    Installation manuelle

    Un XCFramework est un paquet binaire que vous utilisez pour installer SDK Driver. Vous pouvez utiliser ce package sur plusieurs plates-formes, y compris les machines utilisant Apple silicon. Ce guide vous explique comment ajoutez manuellement le XCFramework contenant SDK Driver dans votre projet et configurer votre build dans Xcode.

    Téléchargez le binaire du SDK et ses ressources:

    1. Extrayez les fichiers pour accéder au XCFramework et aux ressources.

    2. Démarrez Xcode, puis ouvrez un projet existant ou créez-en un. projet. Si vous n'avez jamais utilisé iOS, créez un projet et sélectionnez l'application iOS Modèle d'application.

    3. Créez un groupe Frameworks sous votre groupe de projets s'il n'en existe pas. déjà.

    4. Pour installer Driver SDK, faites glisser le GoogleRidesharingDriver.xcframework dans votre projet sous Cadres, bibliothèques et contenu intégré. Lorsque vous y êtes invité, sélectionnez Copiez des éléments si nécessaire.

    5. Faites glisser le GoogleRidesharingDriver.bundle téléchargé pour le placer au premier niveau de votre projet Xcode. Lorsque vous y êtes invité, sélectionnez Copy items if needed.

    6. Sélectionnez votre projet dans le navigateur de projets, puis choisissez votre cible de votre application.

    7. Ouvrez l'onglet Build Phases et, dans Link Binary with libraries, ajoutez le Les frameworks et bibliothèques suivants s'ils ne sont pas déjà présents:

      • Accelerate.framework
      • AudioToolbox.framework
      • AVFoundation.framework
      • CoreData.framework
      • CoreGraphics.framework
      • CoreLocation.framework
      • CoreTelephony.framework
      • CoreText.framework
      • GLKit.framework
      • ImageIO.framework
      • libc++.tbd
      • libxml2.tbd
      • libz.tbd
      • LocalAuthentication.framework
      • OpenGLES.framework
      • QuartzCore.framework
      • SystemConfiguration.framework
      • UIKit.framework
      • WebKit.framework
    8. Choisissez votre projet plutôt qu'une cible spécifique, puis ouvrez le panneau Build Paramètres. Dans la section Other Linker Flags (Autres indicateurs Linker), ajoutez -ObjC pour à la fois au débogage et à la publication. Si ces paramètres ne sont pas visibles, modifiez dans la barre "Paramètres de compilation" en passant de Standard à Tous.

    Inspecter le fichier manifeste de confidentialité Apple

    Apple exige des informations sur la confidentialité des applications disponibles sur l'App Store. Pour obtenir des mises à jour et d'autres informations, consultez la page Informations sur la confidentialité sur l'App Store d'Apple.

    Le fichier manifeste de confidentialité Apple est inclus dans le bundle de ressources pour le SDK. Pour vérifier que le fichier manifeste de confidentialité a été inclus et pour inspecter son contenu, créez une archive de votre application et générez un rapport sur la confidentialité à partir de cette archive.

    Mettre en œuvre l'autorisation et l'authentification

    Lorsque votre application Conducteur génère et envoie des mises à jour au backend Fleet Engine, les demandes doivent inclure des jetons d'accès valides. Pour autoriser et authentifie ces requêtes, le SDK Driver appelle votre objet conformément l'/le/la GMTDAuthorization standard. L'objet est chargé de fournir le jeton d'accès requis.

    En tant que développeur de l'application, vous choisissez la façon dont les jetons sont générés. Votre implémentation doit permettre d'effectuer les opérations suivantes:

    • Extrayez un jeton d'accès, éventuellement au format JSON, à partir d'un serveur HTTPS.
    • Analyser et mettre en cache le jeton.
    • Actualisez le jeton lorsqu'il expire.

    Pour en savoir plus sur les jetons attendus par le serveur Fleet Engine, consultez Créer un jeton Web JSON (JWT) pour l'autorisation

    L'ID du fournisseur est identique à l'ID du projet Google Cloud. Consultez le guide de l'utilisateur de l'API Fleet Engine Deliveries. pour en savoir plus.

    L'exemple suivant met en œuvre un fournisseur de jetons d'accès:

    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    // SampleAccessTokenProvider.h
    @interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
    @end
    
    static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
    
    // SampleAccessTokenProvider.m
    @implementation SampleAccessTokenProvider{
      // The cached vehicle token.
      NSString *_cachedVehicleToken;
      // Keep track of the vehicle ID the cached token is for.
      NSString *_lastKnownVehicleID;
      // Keep track of when tokens expire for caching.
      NSTimeInterval _tokenExpiration;
    }
    
    - (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
                       completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
      if (!completion) {
        NSAssert(NO, @"%s encountered an unexpected nil completion.", __PRETTY_FUNCTION__);
        return;
      }
    
      // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
      NSString *vehicleID = authorizationContext.vehicleID;
      if (!vehicleID) {
        NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
        return;
      }
    
    // Clear cached vehicle token if vehicle ID has changed.
      if (![_lastKnownVehicleID isEqual:vehicleID]) {
        _tokenExpiration = 0.0;
        _cachedVehicleToken = nil;
      }
      _lastKnownVehicleID = vehicleID;
    
      // Clear cached vehicle token if it has expired.
      if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
        _cachedVehicleToken = nil;
      }
    
      // If appropriate, use the cached token.
      if (_cachedVehicleToken) {
        completion(_cachedVehicleToken, nil);
        return;
      }
      // Otherwise, try to fetch a new token from your server.
      NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
      NSMutableURLRequest *request = 
                              [[NSMutableURLRequest alloc] initWithURL:requestURL];
      request.HTTPMethod = @"GET";
      // Replace the following key values with the appropriate keys based on your
      // server's expected response.
      NSString *vehicleTokenKey = @"VEHICLE_TOKEN_KEY";
      NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
      __weak typeof(self) weakSelf = self;
      void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
                      NSError *_Nullable error) =
          ^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
            typeof(self) strongSelf = weakSelf;
            if (error) {
              completion(nil, error);
              return;
            }
    
            NSError *JSONError;
            NSMutableDictionary *JSONResponse =
                [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
    
            if (JSONError) {
              completion(nil, JSONError);
              return;
            } else {
              // Sample code only. No validation logic.
              id expirationData = JSONResponse[tokenExpirationKey];
              if ([expirationData isKindOfClass:[NSNumber class]]) {
                NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
                strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
              }
              strongSelf->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
              completion(JSONResponse[vehicleTokenKey], nil);
            }
        };
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *mainQueueURLSession =  
           [NSURLSession  sessionWithConfiguration:config delegate:nil
    delegateQueue:[NSOperationQueue mainQueue]];
    NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
    [task resume];
    }
    
    @end
    

    Créer une instance DeliveryDriverAPI

    Pour obtenir une instance GMTDDeliveryVehicleReporter, vous devez d'abord créer un GMTDDeliveryDriverAPI avec l'ID du fournisseur, véhiculesID, driverContext et accessTokenProvider. Le champ providerID est identique à ID du projet Google Cloud. Et vous pouvez accéder à GMTDDeliveryVehicleReporter directement à partir de l'API du pilote.

    L'exemple suivant crée une instance GMTDDeliveryDriverAPI:

    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView;
    }
    
    - (void)viewDidLoad {
      NSString *vehicleID = @"INSERT_CREATED_VEHICLE_ID";
      SampleAccessTokenProvider *accessTokenProvider = 
                                    [[SampleAccessTokenProvider alloc] init];
      GMTDDriverContext *driverContext = 
         [[GMTDDriverContext alloc] initWithAccessTokenProvider:accessTokenProvider
                                                     providerID:PROVIDER_ID 
                                                  vehicleID:vehicleID 
          navigator:_mapView.navigator];
    
      GMTDDeliveryDriverAPI *deliveryDriverAPI = [[GMTDDeliveryDriverAPI alloc] initWithDriverContext:driverContext];
    }
    

    Écouter les événements VehicleReporter (facultatif)

    GMTDDeliveryVehicleReporter met régulièrement à jour le véhicule lorsque locationTrackingEnabled est "OUI". Pour répondre à ces mises à jour périodiques, peut s'abonner aux événements GMTDDeliveryVehicleReporter en respectant le protocole GMTDVehicleReporterListener.

    Vous pouvez gérer les événements suivants:

    • vehicleReporter:didSucceedVehicleUpdate

      Informe l'application pilote que les services de backend ont bien reçu le mise à jour de la position et de l'état du véhicule

    • vehicleReporter:didFailVehicleUpdate:withError

      Informe l'écouteur qu'une mise à jour du véhicule a échoué. Tant que la localisation le suivi est activé, GMTDDeliveryVehicleReporter continue d'envoyer le les plus récentes vers le backend Fleet Engine.

    L'exemple suivant gère ces événements:

    SampleViewController.h
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    SampleViewController.m
    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView;
    }
    
    
    - (void)viewDidLoad {
      // ASSUMES YOU IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      [ridesharingDriverAPI.vehicleReporter addListener:self];
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
      // Handle update succeeded.
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
      // Handle update failed.
    }
    
    @end
    

    Activer le suivi de la position

    Pour activer le suivi de la position, votre application peut définir locationTrackingEnabled sur YES le GMTDDeliveryVehicleReporter. Ensuite, GMTDDeliveryVehicleReporter fera = envoyer automatiquement des mises à jour de la position géographique. Lorsque GMSNavigator est en cours de navigation mode (quand une destination est définie via setDestinations) et "locationTrackingEnabled" est défini sur "YES", "GMTDDeliveryVehicleReporter" envoyer automatiquement des mises à jour de l'itinéraire et de l'heure d'arrivée prévue.

    L'itinéraire défini lors de ces mises à jour est le même que celui emprunté par le conducteur d'accéder pendant la session de navigation. Ainsi, pour que le suivi des expéditions fonctionne correctement, le point de cheminement défini dans -setDestinations:callback: doit correspondre la destination définie dans le backend Fleet Engine.

    L'exemple suivant active le suivi de la position:

    SampleViewController.m
    #import “SampleViewController.h”
    #import “SampleAccessTokenProvider.h”
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
     GMSMapView *_mapView; 
    }
    
    - (void)viewDidLoad {
      // ASSUMES YOU IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      deliveryDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
    }
    
    @end
    

    Par défaut, l'intervalle de rapport est de 10 secondes, mais il peut être modifié par locationUpdateInterval. Intervalle minimal de mise à jour accepté est de 5 secondes. L'intervalle de mise à jour maximal accepté est de 60 secondes. Plus fréquente les mises à jour peuvent ralentir les requêtes et provoquer des erreurs.

    Désactiver les notifications de position

    Votre application peut désactiver les mises à jour de la position d'un véhicule. Par exemple, lorsqu'un fin de journée de travail du conducteur, votre application peut définir locationTrackingEnabled sur NO.

      _vehicleReporter.locationTrackingEnabled = NO
    

    Gérer les erreurs update_mask

    Lorsque GMTDDeliveryVehicleReporter envoie une mise à jour du véhicule, un update_mask peut se produire lorsque le masque est vide. Elle se produit généralement pour la première se mettent à jour après le démarrage. L'exemple suivant montre comment gérer cette erreur:

    Swift

    import GoogleRidesharingDriver
    
    class VehicleReporterListener: NSObject, GMTDVehicleReporterListener {
      func vehicleReporter(
        _ vehicleReporter: GMTDVehicleReporter,
        didFail vehicleUpdate: GMTDVehicleUpdate,
        withError error: Error
      ) {
        let fullError = error as NSError
        if let innerError = fullError.userInfo[NSUnderlyingErrorKey] as? NSError {
          let innerFullError = innerError as NSError
          if innerFullError.localizedDescription.contains("update_mask cannot be empty") {
            emptyMaskUpdates += 1
            return
          }
        }
        failedUpdates += 1
      }
    
      override init() {
        emptyMaskUpdates = 0
        failedUpdates = 0
      }
    }
    
    

    Objective-C

    #import "VehicleReporterListener.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    @implementation VehicleReporterListener {
      NSInteger emptyMaskUpdates = 0;
      NSInteger failedUpdates = 0;
    }
    
    - (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter
      didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate
                 withError:(NSError *)error {
      for (NSError *underlyingError in error.underlyingErrors) {
        if ([underlyingError.localizedDescription containsString:@"update_mask cannot be empty"]) {
          emptyMaskUpdates += 1;
          return;
        }
      }
      failedUpdates += 1
    }
    
    @end