Wenn Sie einer Fahrt folgen, zeigt Ihre Nutzer-App den Standort der am besten geeignet ist. Dazu muss deine App einer Fahrt folgen, den Fahrtfortschritt aktualisieren und einer Fahrt nicht mehr folgen, abgeschlossen wird.
In diesem Dokument erfahren Sie, wie dieser Vorgang funktioniert.
Einer Reise folgen
So können Sie eine Fahrt mit der Funktion „Teilen von Reiseinformationen“ verfolgen:
Alle Nutzereingaben wie Abgabe- und Abholorte erfassen von einem
ViewController
.Erstellen Sie eine neue
ViewController
, um die Reise direkt mit anderen zu teilen.
Das folgende Beispiel zeigt, wie Sie direkt nach der geladenen Ansichten.
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];
}
Einer Fahrt nicht mehr folgen
Sie können die Fahrt nicht mehr verfolgen, wenn sie abgeschlossen oder abgebrochen wurde. Die folgenden Das Beispiel zeigt, wie eine aktive Fahrt nicht mehr geteilt werden kann.
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];
}
Streckenfortschritt aktualisieren
So verwalten Sie den Streckenfortschritt während einer Fahrt:
Auf Updates warten. Ein Beispiel finden Sie unter Beispiel für das Warten auf Updates:
Updates zu Fahrten verarbeiten Ein Beispiel finden Sie unter Beispiel für Updates zu Fahrten
Wenn eine Fahrt beendet oder abgebrochen wird, hören Sie auf, nach Updates zu suchen. Ein Beispiel finden Sie unter Beispiel zum Beenden des Wartens auf Updates:
Beispiel: Warten auf Updates starten
Das folgende Beispiel zeigt, wie der tripModel
-Callback registriert wird.
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];
...
}
Beispiel: Warten auf Updates beenden
Das folgende Beispiel zeigt, wie die Registrierung der tripModel
storniert wird
Callback des Nutzers an.
Swift
/*
* MapViewController.swift
*/
deinit {
self.currentTripModel.unregisterSubscriber(self)
}
Objective-C
/*
* MapViewController.m
*/
- (void)dealloc {
[self.currentTripModel unregisterSubscriber:self];
...
}
Beispiel für die Verarbeitung von Fahrtaktualisierungen
Das folgende Beispiel zeigt, wie GMTCTripModelSubscriber
implementiert wird
Protokoll zur Verarbeitung von Callbacks, wenn der Fahrtstatus aktualisiert wird.
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.
}
Fehler bei Fahrten verarbeiten
Wenn du tripModel
abonniert hast und ein Fehler auftritt, kannst du den Callback abrufen.
von tripModel
durch Implementieren der delegate-Methode
tripModel(_:didFailUpdateTripWithError:)
. Fehler
folgen dem Google Cloud Error Standard. Für detaillierten Fehler
sowie alle Fehlercodes finden Sie unter
Dokumentation zu Google Cloud-Fehlern
Im Folgenden sind einige häufige Fehler aufgeführt, die bei der Fahrtüberwachung auftreten können:
HTTP | RPC | Beschreibung |
---|---|---|
400 | INVALID_ARGUMENT | Der Kunde hat einen ungültigen Fahrtnamen angegeben. Der Name der Reise muss den
Format providers/{provider_id}/trips/{trip_id} . Die
provider_id muss die ID des Cloud-Projekts sein, das zu
Dienstanbieter. |
401 | NICHT AUTHENTIFIZIERT | Dieser Fehler wird angezeigt, wenn keine gültigen Anmeldedaten für die Authentifizierung vorhanden sind. Beispiel: Das JWT-Token ist ohne Fahrt-ID oder JWT-Token signiert. ist abgelaufen. |
403 | PERMISSION_DENIED | Sie erhalten diesen Fehler, wenn der Client nicht über ausreichende Berechtigungen verfügt Beispiel: Ein Nutzer mit der Nutzerrolle versucht, "updateTrip" aufzurufen, wenn Das JWT-Token ist ungültig oder die API ist nicht für das Clientprojekt aktiviert. Möglicherweise fehlt das JWT-Token oder ist mit einer Fahrt-ID signiert, die stimmt nicht mit der angeforderten Fahrt-ID überein. |
429 | RESOURCE_EXHAUSTED | Das Ressourcenkontingent beträgt null oder die Traffic-Rate überschreitet das Limit. |
503 | UNAVAILABLE | Dienst nicht verfügbar: In der Regel ist der Server ausgefallen. |
504 | DEADLINE_EXCEEDED | Die Frist der Anfrage wurde überschritten. Dieser Fehler tritt nur auf, wenn der Aufrufer ein Frist, die kürzer ist als die Standardfrist der Methode (d. h. die die angeforderte Frist nicht ausreicht, um die Anfrage vom Server zu verarbeiten) und wurde die Anfrage nicht innerhalb der Frist abgeschlossen. |
Umgang mit Consumer SDK-Fehlern
Das Consumer SDK sendet Fehler bei der Fahrtaktualisierung mithilfe eines Callbacks an die Nutzer-App.
Mechanismus zur Verfügung. Der Callback-Parameter ist ein plattformspezifischer Rückgabetyp (
TripUpdateError
auf Android und
NSError
auf iOS-Geräten).
Statuscodes extrahieren
Die an den Callback übergebenen Fehler sind in der Regel gRPC-Fehler. Sie können auch um zusätzliche Informationen in Form eines Statuscodes zu extrahieren. Für die vollständige Liste der Statuscodes siehe Statuscodes und ihre Verwendung in gRPC
Swift
Die NSError
wird in tripModel(_:didFailUpdateTripWithError:)
zurückgerufen.
// 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
NSError
wird in tripModel:didFailUpdateTripWithError:
wieder aufgerufen.
// 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;
...
}
}
Statuscodes interpretieren
Statuscodes decken zwei Arten von Fehlern ab: server- und netzwerkbezogene Fehler und clientseitige Fehler beheben.
Server- und Netzwerkfehler
Die folgenden Statuscodes beziehen sich entweder auf Netzwerk- oder Serverfehler, und Sie Sie müssen nichts weiter unternehmen, um sie zu lösen. Das Consumer SDK stellt sich automatisch wieder her.
Statuscode | Beschreibung |
---|---|
ABORTED | Der Server sendet keine Antwort mehr. Dies ist normalerweise auf eine Serverproblem. |
CANCELLED | Der Server hat die ausgehende Antwort beendet. Dies ist normalerweise
passiert, wenn
die App in den Hintergrund verschoben wird oder eine Statusänderung im Nutzer-App. |
INTERRUPTED | |
DEADLINE_EXCEEDED | Die Antwort des Servers hat zu lange gedauert. |
UNAVAILABLE | Der Server war nicht verfügbar. Die Ursache hierfür ist normalerweise ein Netzwerk Problem. |
Clientfehler
Die folgenden Statuscodes beziehen sich auf Clientfehler und Sie müssen Maßnahmen ergreifen, und sie zu lösen. Das Consumer SDK versucht weiterhin, die Fahrt zu aktualisieren, bis Sie die Fahrtfreigabe beenden. Die Fahrt wird jedoch erst wiederhergestellt, wenn Sie eine Maßnahme ergreifen.
Statuscode | Beschreibung |
---|---|
INVALID_ARGUMENT | In der Verbraucher-App wurde ein ungültiger Fahrtname angegeben. Der Fahrtname muss dem Format providers/{provider_id}/trips/{trip_id} entsprechen.
|
NOT_FOUND | Die Reise wurde nie erstellt. |
PERMISSION_DENIED | Die Berechtigungen der Nutzer-App reichen nicht aus. Dieser Fehler tritt in folgenden Fällen auf:
|
RESOURCE_EXHAUSTED | Das Ressourcenkontingent ist null oder die Traffic-Flussrate überschreitet die die Geschwindigkeitsbegrenzung zu verwenden. |
NICHT AUTHENTIFIZIERT | Die Authentifizierung der Anfrage ist aufgrund eines ungültigen JWT-Tokens fehlgeschlagen. Dieser Fehler tritt entweder auf, wenn das JWT-Token ohne Fahrt-ID signiert ist, oder wenn das JWT-Token abgelaufen ist. |