This section shows how to get the vehicle ready for trips. You must complete
each of the following steps before your backend can match a vehicle to a trip.

## Set up listeners

After initializing the Driver SDK and creating a `GMTDRidesharingDriverAPI`
instance, you can set up event listeners to monitor the success or failure of
vehicle updates sent to Fleet Engine and your backend. These listeners can
trigger actions within your driver app, such as notifying the driver if
communication with your backend fails.

### Listen for vehicle update events

When the driver enables location updates in the driver app, the Driver SDK
sends regular vehicle updates to Fleet Engine and the customer
backend through the `GMTDVehicleReporter` class. You can have the app respond
to update events by setting up the `GMTDVehicleReporterListener` protocol.

With `GMTDVehicleReporterListener`, you can handle the following events:

- [`vehicleReporter:didSucceedVehicleUpdate`](https://developers.google.com/maps/documentation/mobility/driver-sdk/on-demand/reference/ios/protocol_g_m_t_d_vehicle_reporter_listener-p#a3882e0ff1b3e89d47f501c194818baf5)

  Informs the Driver app that the backend services successfully received the
  vehicle location and state update.
- [`vehicleReporter:didFailVehicleUpdate:withError`](https://developers.google.com/maps/documentation/mobility/driver-sdk/on-demand/reference/ios/protocol_g_m_t_d_vehicle_reporter_listener-p#a494bc226e6a36c4a4528d35919ce5085)

  Informs the listener that a vehicle update failed. As long as the driver has
  location updates enabled, the `GMTDVehicleReporter` class continues to send
  the latest data to Fleet Engine.

The following examples show how to set up `GMTDVehicleReporterListener` to
handle these events:

### Swift

```swift
import GoogleRidesharingDriver

private let providerID = "INSERT_YOUR_PROVIDER_ID"

class SampleViewController: UIViewController, GMTDVehicleReporterListener {
  private let mapView: GMSMapView

  override func viewDidLoad() {
    // Assumes you have implemented the sample code up to this step.
    ridesharingDriverAPI.vehicleReporter.add(self)
  }

  func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didSucceed vehicleUpdate: GMTDVehicleUpdate) {
    // Handle update succeeded.
  }

  func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didFail vehicleUpdate: GMTDVehicleUpdate, withError error: Error) {
    // Handle update failed.
  }
}
```

### Objective-C

```objective-c
/**
 *   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 have implemented the sample code up to this step.
  [ridesharingDriverAPI.vehicleReporter addListener:self];
}

- (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
  // Handle update succeeded.
}

- (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
  // Handle update failed.
}

@end
```

### Listen for vehicle location updates

The Navigation SDK provides location updates to the Driver SDK through the
`GMSRoadSnappedLocationProvider` class. To receive those updates, you must set
up the `GMTDVehicleReporter` as a listener.

> [!NOTE]
> **Note:** If the device has not moved since the last location update, the `GMSRoadSnappedLocationProvider` class does not send location updates continuously for better performance. For example, if a driver is waiting idle in the car. If you want to send a new location update, and have set `GMTDVehicleReporter` as a listener after calling `startUpdatingLocation` on `GMSRoadSnappedLocationProvider`, you need to stop and start `GMSRoadSnappedLocationProvider`.

### Swift

```swift
import GoogleRidesharingDriver

private let providerID = "INSERT_YOUR_PROVIDER_ID"

class SampleViewController: UIViewController, GMTDVehicleReporterListener {
  private let mapView: GMSMapView

  override func viewDidLoad() {
    // Assumes you have implemented the sample code up to this step.
    if let roadSnappedLocationProvider = mapView.roadSnappedLocationProvider {
      roadSnappedLocationProvider.add(ridesharingDriverAPI.vehicleReporter)
      roadSnappedLocationProvider.startUpdatingLocation()
    }
  }
}
```

### Objective-C

```objective-c
/**
 *   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 have implemented the sample code up to this step.
  [_mapView.roadSnappedLocationProvider addListener:ridesharingDriverAPI.vehicleReporter];
  [_mapView.roadSnappedLocationProvider startUpdatingLocation];
}

@end
```

## Enable location updates

To enable location updates, set `locationTrackingEnabled` to `true` on
`GMTDVehicleReporter` in the driver app. Then the `GMTDVehicleReporter` class
automatically sends location updates to Fleet Engine. After the Fleet Engine and
customer backend services match and assign the vehicle to a trip, the
`GMTDVehicleReporter` class sends route updates automatically when the
`GMSNavigator` is in navigation mode, which is when a destination is set through
`setDestinations`.

The Driver SDK sets the route to match the driver's current navigation path. To
ensure accurate location updates, set the waypoint in `setDestinations` to match
the destination in Fleet Engine.

The following example shows how to enable location updates:

### Swift

```swift
import GoogleRidesharingDriver

private let providerID = "INSERT_YOUR_PROVIDER_ID"

class SampleViewController: UIViewController, GMTDVehicleReporterListener {
  private let mapView: GMSMapView

  override func viewDidLoad() {
    // Assumes you have implemented the sample code up to this step.
    ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = true
  }
}
```

### Objective-C

```objective-c
/**
 *   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 have implemented the sample code up to this step.
  ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
}

@end
```

### Set the update interval

By default, when you set `locationTrackingEnabled` to `true`, the Driver SDK
sends trip and vehicle updates to Fleet Engine at a 10-second interval. You can
change the update interval with `locationUpdateInterval` to a minimum update
interval of 5 seconds or a maximum of 60 seconds. More frequent updates may
result in slower requests and errors.

## Set the vehicle state to online

After you enable location updates, set the vehicle state to `ONLINE` to make the
vehicle available for search queries in Fleet Engine.

The following examples show how to set the vehicle state to `ONLINE`. For
details, see [`updateVehicleState`](https://developers.google.com/maps/documentation/mobility/driver-sdk/on-demand/reference/ios/interface_g_m_t_d_vehicle_reporter).

### Swift

```swift
import GoogleRidesharingDriver

private let providerID = "INSERT_YOUR_PROVIDER_ID"

class SampleViewController: UIViewController, GMTDVehicleReporterListener {
  private let mapView: GMSMapView

  override func viewDidLoad() {
    // Assumes you have implemented the sample code up to this step.
    ridesharingDriverAPI.vehicleReporter.update(.online)
  }
}
```

### Objective-C

```objective-c
#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 have implemented the sample code up to this step.
  [ridesharingDriverAPI.vehicleReporter
                                   updateVehicleState:GMTDVehicleStateOnline];
}

@end
```

## What's next

[Set the trip details](https://developers.google.com/maps/documentation/mobility/driver-sdk/on-demand/ios/trip-details.md.txt)