Lorsque vous suivez un trajet, votre application grand public affiche la position véhicule approprié pour le consommateur. Pour ce faire, votre application doit commencer à suivre un trajet, mettre à jour la progression du trajet et arrêter de suivre un trajet lorsqu'il est terminé.
Ce document explique comment ce processus fonctionne.
Commencer à suivre un trajet
Voici comment commencer à suivre un trajet à l'aide du partage de parcours:
Rassembler toutes les entrées utilisateur, telles que les lieux de dépôt et de prise en charge à partir d'un
ViewController
.Créez un
ViewController
pour commencer à partager le parcours directement.
L'exemple suivant montre comment commencer à partager un parcours immédiatement après le chargements de vues.
Swift
/*
* MapViewController.swift
*/
override func viewDidLoad() {
super.viewDidLoad()
...
self.mapView = GMTCMapView(frame: UIScreen.main.bounds)
self.mapView.delegate = self
self.view.addSubview(self.mapView)
}
func mapViewDidInitializeCustomerState(_: GMTCMapView) {
self.mapView.pickupLocation = self.selectedPickupLocation
self.mapView.dropoffLocation = self.selectedDropoffLocation
self.startConsumerMatchWithLocations(
pickupLocation: self.mapView.pickupLocation!,
dropoffLocation: self.mapView.dropoffLocation!
) { [weak self] (tripName, error) in
guard let strongSelf = self else { return }
if error != nil {
// print error message.
return
}
let tripService = GMTCServices.shared().tripService
// Create a tripModel instance for listening the update of the trip
// specified by this trip name.
let tripModel = tripService.tripModel(forTripName: tripName)
// Create a journeySharingSession instance based on the tripModel
let journeySharingSession = GMTCJourneySharingSession(tripModel: tripModel)
// Add the journeySharingSession instance on the mapView for UI updating.
strongSelf.mapView.show(journeySharingSession)
// Register for the trip update events.
tripModel.register(strongSelf)
strongSelf.currentTripModel = tripModel
strongSelf.currentJourneySharingSession = journeySharingSession
strongSelf.hideLoadingView()
}
self.showLoadingView()
}
Objective-C
/*
* MapViewController.m
*/
- (void)viewDidLoad {
[super viewDidLoad];
...
self.mapView = [[GMTCMapView alloc] initWithFrame:CGRectZero];
self.mapView.delegate = self;
[self.view addSubview:self.mapView];
}
// Handle the callback when the GMTCMapView did initialized.
- (void)mapViewDidInitializeCustomerState:(GMTCMapView *)mapview {
self.mapView.pickupLocation = self.selectedPickupLocation;
self.mapView.dropoffLocation = self.selectedDropoffLocation;
__weak __typeof(self) weakSelf = self;
[self startTripBookingWithPickupLocation:self.selectedPickupLocation
dropoffLocation:self.selectedDropoffLocation
completion:^(NSString *tripName, NSError *error) {
__typeof(self) strongSelf = weakSelf;
GMTCTripService *tripService = [GMTCServices sharedServices].tripService;
// Create a tripModel instance for listening to updates to the trip specified by this trip name.
GMTCTripModel *tripModel = [tripService tripModelForTripName:tripName];
// Create a journeySharingSession instance based on the tripModel.
GMTCJourneySharingSession *journeySharingSession =
[[GMTCJourneySharingSession alloc] initWithTripModel:tripModel];
// Add the journeySharingSession instance on the mapView for updating the UI.
[strongSelf.mapView showMapViewSession:journeySharingSession];
// Register for trip update events.
[tripModel registerSubscriber:self];
strongSelf.currentTripModel = tripModel;
strongSelf.currentJourneySharingSession = journeySharingSession;
[strongSelf hideLoadingView];
}];
[self showLoadingView];
}
Arrêter de suivre un trajet
Vous arrêtez de suivre un trajet lorsqu'il est terminé ou annulé. Les éléments suivants : montre comment arrêter de partager le trajet en cours.
Swift
/*
* MapViewController.swift
*/
func cancelCurrentActiveTrip() {
// Stop the tripModel
self.currentTripModel.unregisterSubscriber(self)
// Remove the journey sharing session from the mapView's UI stack.
self.mapView.hide(journeySharingSession)
}
Objective-C
/*
* MapViewController.m
*/
- (void)cancelCurrentActiveTrip {
// Stop the tripModel
[self.currentTripModel unregisterSubscriber:self];
// Remove the journey sharing session from the mapView's UI stack.
[self.mapView hideMapViewSession:journeySharingSession];
}
Mettre à jour la progression
Pendant un trajet, vous gérez la progression du trajet comme suit:
Commencez à écouter les actualités. Pour voir un exemple, consultez Exemple d'écoute des mises à jour.
Gérez les informations sur les trajets. Pour voir un exemple, consultez Exemple de gestion des mises à jour des trajets
Lorsqu'un trajet se termine ou est annulé, arrêtez l'écoute des mises à jour. Pour voir un exemple, consultez Exemple d'arrêt de l'écoute des informations.
Exemple de lancement d'une écoute de mises à jour
L'exemple suivant montre comment enregistrer le rappel tripModel
.
Swift
/*
* MapViewController.swift
*/
override func viewDidLoad() {
super.viewDidLoad()
// Register for trip update events.
self.currentTripModel.register(self)
}
Objective-C
/*
* MapViewController.m
*/
- (void)viewDidLoad {
[super viewDidLoad];
// Register for trip update events.
[self.currentTripModel registerSubscriber:self];
...
}
Exemple d'arrêt de l'écoute d'informations
L'exemple suivant montre comment annuler l'enregistrement du rappel tripModel
.
Swift
/*
* MapViewController.swift
*/
deinit {
self.currentTripModel.unregisterSubscriber(self)
}
Objective-C
/*
* MapViewController.m
*/
- (void)dealloc {
[self.currentTripModel unregisterSubscriber:self];
...
}
Gérer les mises à jour des trajets
L'exemple suivant montre comment implémenter l'GMTCTripModelSubscriber
protocole permettant de gérer les rappels lorsque l'état du trajet est mis à jour.
Swift
/*
* MapViewController.swift
*/
func tripModel(_: GMTCTripModel, didUpdate trip: GMTSTrip?, updatedPropertyFields: GMTSTripPropertyFields) {
// Update the UI with the new `trip` data.
self.updateUI(with: trip)
}
func tripModel(_: GMTCTripModel, didUpdate tripStatus: GMTSTripStatus) {
// Handle trip status did change.
}
func tripModel(_: GMTCTripModel, didUpdateActiveRouteRemainingDistance activeRouteRemainingDistance: Int32) {
// Handle remaining distance of active route did update.
}
func tripModel(_: GMTCTripModel, didUpdateActiveRoute activeRoute: [GMTSLatLng]?) {
// Handle trip active route did update.
}
func tripModel(_: GMTCTripModel, didUpdate vehicleLocation: GMTSVehicleLocation?) {
// Handle vehicle location did update.
}
func tripModel(_: GMTCTripModel, didUpdatePickupLocation pickupLocation: GMTSTerminalLocation?) {
// Handle pickup location did update.
}
func tripModel(_: GMTCTripModel, didUpdateDropoffLocation dropoffLocation: GMTSTerminalLocation?) {
// Handle drop off location did update.
}
func tripModel(_: GMTCTripModel, didUpdatePickupETA pickupETA: TimeInterval) {
// Handle the pickup ETA did update.
}
func tripModel(_: GMTCTripModel, didUpdateDropoffETA dropoffETA: TimeInterval) {
// Handle the drop off ETA did update.
}
func tripModel(_: GMTCTripModel, didUpdateRemaining remainingWaypoints: [GMTSTripWaypoint]?) {
// Handle updates to the pickup, dropoff or intermediate destinations of the trip.
}
func tripModel(_: GMTCTripModel, didFailUpdateTripWithError error: Error?) {
// Handle the error.
}
func tripModel(_: GMTCTripModel, didUpdateIntermediateDestinations intermediateDestinations: [GMTSTerminalLocation]?) {
// Handle the intermediate destinations being updated.
}
func tripModel(_: GMTCTripModel, didUpdateActiveRouteTraffic activeRouteTraffic: GMTSTrafficData?) {
// Handle trip active route traffic being updated.
}
Objective-C
/*
* MapViewController.m
*/
#pragma mark - GMTCTripModelSubscriber implementation
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateTrip:(nullable GMTSTrip *)trip
updatedPropertyFields:(enum GMTSTripPropertyFields)updatedPropertyFields {
// Update the UI with the new `trip` data.
[self updateUIWithTrip:trip];
...
}
- (void)tripModel:(GMTCTripModel *)tripModel didUpdateTripStatus:(enum GMTSTripStatus)tripStatus {
// Handle trip status did change.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateActiveRouteRemainingDistance:(int32_t)activeRouteRemainingDistance {
// Handle remaining distance of active route did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateActiveRoute:(nullable NSArray<GMTSLatLng *> *)activeRoute {
// Handle trip active route did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateVehicleLocation:(nullable GMTSVehicleLocation *)vehicleLocation {
// Handle vehicle location did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdatePickupLocation:(nullable GMTSTerminalLocation *)pickupLocation {
// Handle pickup location did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateDropoffLocation:(nullable GMTSTerminalLocation *)dropoffLocation {
// Handle drop off location did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel didUpdatePickupETA:(NSTimeInterval)pickupETA {
// Handle the pickup ETA did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateRemainingWaypoints:(nullable NSArray<GMTSTripWaypoint *> *)remainingWaypoints {
// Handle updates to the pickup, dropoff or intermediate destinations of the trip.
}
- (void)tripModel:(GMTCTripModel *)tripModel didUpdateDropoffETA:(NSTimeInterval)dropoffETA {
// Handle the drop off ETA did update.
}
- (void)tripModel:(GMTCTripModel *)tripModel didFailUpdateTripWithError:(nullable NSError *)error {
// Handle the error.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateIntermediateDestinations:
(nullable NSArray<GMTSTerminalLocation *> *)intermediateDestinations {
// Handle the intermediate destinations being updated.
}
- (void)tripModel:(GMTCTripModel *)tripModel
didUpdateActiveRouteTraffic:(nullable GMTSTrafficData *)activeRouteTraffic {
// Handle trip active route traffic being updated.
}
Gérer les erreurs de trajet
Si vous vous êtes abonné à tripModel
et qu'une erreur se produit, vous pouvez obtenir le rappel
de tripModel
en implémentant la méthode déléguée
tripModel(_:didFailUpdateTripWithError:)
Erreur
respectent la norme d'erreur Google Cloud. Pour plus d'informations sur l'erreur
les définitions de message et tous les codes d'erreur, reportez-vous
Documentation sur les erreurs Google Cloud
Voici quelques erreurs courantes qui peuvent se produire lors de la surveillance des trajets:
HTTP | RPC | Description |
---|---|---|
400 | INVALID_ARGUMENT | Le client a spécifié un nom de trajet non valide. Le nom du trajet doit suivre
le format providers/{provider_id}/trips/{trip_id} . provider_id doit être l'ID du projet Cloud appartenant au fournisseur de services. |
401 | UNAUTHENTICATED | Ce message d'erreur s'affiche si aucun identifiant d'authentification n'est valide. Par exemple, si le jeton JWT est signé sans ID de trajet ni jeton JWT a expiré. |
403 | PERMISSION_DENIED | Vous recevez cette erreur si le client ne dispose pas des autorisations nécessaires (par exemple, un utilisateur ayant le rôle grand public essaie d'appeler updateTrip), si le jeton JWT n'est pas valide ou l'API n'est pas activée pour le projet client. Il est possible que le jeton JWT soit manquant ou qu'il soit signé avec un ID de trajet ne correspond pas à l'identifiant de trajet demandé. |
429 | RESOURCE_EXHAUSTED | Le quota de ressources est égal à zéro ou le taux de trafic dépasse la limite. |
503 | UNAVAILABLE | Service indisponible. Généralement, le serveur est inactif. |
504 | DEADLINE_EXCEEDED | Délai de requête dépassé. Cette erreur ne se produit que si l'appelant définit plus court que le délai par défaut de la méthode (c'est-à-dire, le délai demandé n'est pas suffisant pour que le serveur puisse traiter la demande). la demande n'a pas abouti dans le délai imparti. |
Gérer les erreurs du SDK client
Le SDK grand public envoie les erreurs de mise à jour du trajet à l'application grand public à l'aide d'un rappel.
sur le mécanisme d'attention. Le paramètre de rappel est un type renvoyé spécifique à la plate-forme (
TripUpdateError
sur Android et
NSError
sur iOS).
Extraire les codes d'état
Les erreurs transmises au rappel sont généralement des erreurs gRPC. Vous pouvez aussi et d'en extraire des informations supplémentaires sous la forme d'un code d'état. Pour le la liste complète des codes d'état, reportez-vous à Codes d'état et leur utilisation dans gRPC.
Swift
NSError
est appelé dans tripModel(_:didFailUpdateTripWithError:)
.
// Called when there is a trip update error.
func tripModel(_ tripModel: GMTCTripModel, didFailUpdateTripWithError error: Error?) {
// Check to see if the error comes from gRPC.
if let error = error as NSError?, error.domain == "io.grpc" {
let gRPCErrorCode = error.code
...
}
}
Objective-C
Le NSError
est rappelé dans tripModel:didFailUpdateTripWithError:
.
// Called when there is a trip update error.
- (void)tripModel:(GMTCTripModel *)tripModel didFailUpdateTripWithError:(NSError *)error {
// Check to see if the error comes from gRPC.
if ([error.domain isEqualToString:@"io.grpc"]) {
NSInteger gRPCErrorCode = error.code;
...
}
}
Interpréter les codes d'état
Les codes d'état couvrent deux types d'erreurs : les erreurs liées au serveur et au réseau, et les erreurs côté client.
Erreurs de serveur et de réseau
Les codes d'état suivants correspondent à des erreurs de réseau ou de serveur. Aucune action de votre part n'est requise pour les résoudre. Consumer SDK automatiquement s'en remet.
Code d'état | Description |
---|---|
ABORTED | Le serveur a arrêté d'envoyer la réponse. Cela est généralement dû à de serveur. |
ANNULÉ | Le serveur a interrompu la réponse sortante. Cela se produit généralement lorsque l'application est envoyée en arrière-plan ou lorsqu'il y a un changement d'état dans l'application consommateur . |
INTERRUPTED | |
DEADLINE_EXCEEDED | Le serveur a mis trop de temps à répondre. |
UNAVAILABLE | Le serveur était indisponible. Ce problème est généralement dû à un problème réseau. |
Erreurs client
Les codes d'état suivants correspondent aux erreurs du client. Vous devez prendre des mesures pour les résoudre. Le SDK grand public continue d'actualiser le trajet jusqu'à ce que vous partager le parcours, mais il ne se rétablira pas tant que vous n’aurez pas pris de mesure.
Code d'état | Description |
---|---|
INVALID_ARGUMENT | L'application destinée aux consommateurs a spécifié un nom de trajet non valide. Le nom du trajet doit respecter le format providers/{provider_id}/trips/{trip_id} .
|
NOT_FOUND | Le voyage n'a jamais été créé. |
PERMISSION_DENIED | L'application grand public ne dispose pas des autorisations nécessaires. Cette erreur se produit dans les cas suivants:
|
RESOURCE_EXHAUSTED | Le quota de ressources est égal à zéro, ou le débit du trafic dépasse le limite de vitesse. |
UNAUTHENTICATED | L'authentification de la requête a échoué en raison d'un jeton JWT non valide. Ce se produit lorsque le jeton JWT est signé sans ID de trajet, ou Lorsque le jeton JWT a expiré. |