Modularization

VERSION 0.2.2746
PUBLIC PREVIEW

The Navigation SDK for iOS is only available upon request. Contact us to get started.

The architecture of the TomTom SDKs is modular, meaning that each navigation component is independent of the others. As a result, components can easily be replaced with ones from other sources or left out if they are not needed. That makes it easier to change the standard SDK to address a specific use case. These replaceable components are referred to as engines.

Orchestrator

The Navigation module depends on engines to orchestrate a pipeline after each location update. Different engines are used during different parts of the navigation flow, as shown in the following image.

The orchestrator contains two main checks to determine if calculation should continue or stop for a given location update. After matching a location to the map and providing location context, the pipeline stops if navigation:

  • is in free driving mode (there is no route)
  • has previously detected a deviation from the route

If none of the conditions are met, the flow proceeds with calculating route progress. If, after this, no deviation has been detected, it will continue to calculate guidance, check for arrival, and replan the route if necesssary.

Engines

The orchestrator works with the following engines:

The LocationProvider is part of the Location module.

All of the other engines are in the Navigation module.

Customized engines can be set during the configuration of Navigation:

1let configuration =
2 NavigationConfigurationBuilder(
3 navigationKey: "<NAVIGATION-KEY>",
4 locationProvider: customLocationProvider,
5 routeReplanner: routeReplanner
6 )
7 .with(mapMatchingEngine: customMapMatchingEngine)
8 .with(routeReplanningEngine: customRouteReplanningEngine)
9 .with(guidanceEngine: customGuidanceEngine)
10 .with(routeTrackingEngine: customRouteTrackingEngine)
11 .with(routeProgressEngine: customRouteProgressDetectionEngine)
12 .with(locationContextDetectionEngine: customLocationContextDetectionEngine)
13 .with(arrivalDetectionEngine: customArrivalDetectionEngine)
14 .build()
15let navigation = Navigation(configuration: configuration)

The location provider is the only engine that can also be changed and customized after the creation of Navigation:

navigation.locationProvider = locationProvider