This tutorial shows, in a Swift app, how we can use MapKit’s free direction service MKDirections, to get a route between two coordinates and show the resulting route on a Google Map, GMSMapView.

First, get this file, and save it within your project as Polyline.swift. This will be used to create Polyline from coordinates:

https://github.com/raphaelmor/Polyline/blob/master/Sources/Polyline/Polyline.swift

Second, use the two coordinates and pin markers on the points.

import UIKit
import GoogleMaps 
import MapKit
func setMapMarkersRoute(vLoc: CLLocationCoordinate2D, toLoc: CLLocationCoordinate2D) {

    //add the markers for the 2 locations
    let markerTo = GMSMarker.init(position: toLoc)
    markerTo.map = mapView
    let vMarker = GMSMarker.init(position: vLoc)
    vMarker.map = mapView

    //zoom the map to show the desired area
    var bounds = GMSCoordinateBounds()
    bounds = bounds.includingCoordinate(vLoc)
    bounds = bounds.includingCoordinate(toLoc)
    self.mapView.moveCamera(GMSCameraUpdate.fit(bounds))

    //finally get the route
    getRoute(from: vLoc, to: toLoc)

}

Third, the function to get the directions using MKDirections

func getRoute(from: CLLocationCoordinate2D, to: CLLocationCoordinate2D) {
    
    let source = MKMapItem(placemark: MKPlacemark(coordinate: from))
    let destination = MKMapItem(placemark: MKPlacemark(coordinate: to))

    let request = MKDirections.Request()
    request.source = source
    request.destination = destination
    request.requestsAlternateRoutes = false

    let directions = MKDirections(request: request)

    directions.calculate(completionHandler: { (response, error) in
        if let res = response {
            //the function to convert the result and show
            self.show(polyline: self.googlePolylines(from: res))
        }
    })
}

Fourth, converting the result from MKDirections, to GMSPolyline, that can be used with GMSMapView

private func googlePolylines(from response: MKDirections.Response) -> GMSPolyline {

    let route = response.routes[0]
    var coordinates = [CLLocationCoordinate2D](
        repeating: kCLLocationCoordinate2DInvalid,
        count: route.polyline.pointCount)

    route.polyline.getCoordinates(
        &coordinates,
        range: NSRange(location: 0, length: route.polyline.pointCount))

    let polyline = Polyline(coordinates: coordinates)
    let encodedPolyline: String = polyline.encodedPolyline
    let path = GMSPath(fromEncodedPath: encodedPolyline)
    return GMSPolyline(path: path)
    
}

Fifth, finally show it on the GMSMapView

func show(polyline: GMSPolyline) {

    //add style to polyline
    polyline.strokeColor = UIColor.red
    polyline.strokeWidth = 3
    
    //add to map
    polyline.map = mapView
}

Make sure you have created an outlet to the GMSMapView.

Hope this helps. If you need assistance, feel free to leave a comment!