Migrate UI
The following article outlines the main API changes for the UI components and aims to help with the migration to the
MapboxNavigationUIKit (former MapboxNavigation) library.
The mapbox-navigation-ios repository provides UIKitExample showing how to use the UI components.
Requirements
MapboxNavigationUIKit requires an iOS target to be iOS 14 or higher.
MapboxCoreNavigation migration
MapboxNavigationUIKit builds on MapboxNavigationCore. Visit the MapboxCoreNavigation migration guide to find out how to migrate to MapboxNavigationCore.
MapboxNavigation migration
A library that provides a suite of UI components has been renamed from MapboxNavigation into MapboxNavigationUIKit.
MapboxNavigationUIKit contains the same UI components that were included into MapboxNavigation from Navigation SDK v2.
The UI components included into MapboxNavigationUIKit have adopted a new generation of navigation core functionality that
is provided by MapboxNavigationCore library (former MapboxCoreNavigation).
NavigationViewController
Replace the old NavigationViewController initializer with a new NavigationViewController.init(navigationRoutes: NavigationRoutes, navigationOptions: NavigationOptions):
-
navigationRoutesparameter contains the main and alternative routes and can be obtained viaRoutingProvider. -
navigationOptionsparameter contains customization options for the turn-by-turn navigation user experience and can be constructed using a newMapboxNavigationprotocol.
An example of instantiating NavigationViewController using a routes response from RoutingProvider:
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
do {
let navigationRouteOptions = NavigationRouteOptions(coordinates: coordinates)
let routesResponse = try await navigationProvider.routingProvider().calculateRoutes(options: navigationRouteOptions).value
NavigationViewController(
navigationRoutes: routesResponse,
navigationOptions: NavigationOptions(
mapboxNavigation: navigationProvider.mapboxNavigation,
voiceController: navigationProvider.routeVoiceController,
eventsManager: navigationProvider.eventsManager(),
styles: [NightStyle()],
predictiveCacheManager: navigationProvider.predictiveCacheManager
)
)
} catch {
print("Error occured while requesting routes: \(error.localizedDescription)")
}
NavigationView
Replace the old NavigationView initializer with a new NavigationView.init(frame: CGRect, mapViewConfiguration: MapViewConfiguration).
MapViewConfiguration allows you to re-use existing NavigationMapView or create a new one. If you choose to create a new NavigationMapView you need to provide a list of dependencies that
can be obtained from MapboxNavigation protocol.
An example of instantiating NavigationView that creates a new NavigationMapView:
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
NavigationView(
frame: .zero,
mapViewConfiguration: .createNew(
location: navigationProvider.navigation().locationMatching
.map(\.mapMatchingResult.enhancedLocation)
.eraseToAnyPublisher(),
routeProgress: navigationProvider.navigation().routeProgress
.map(\.?.routeProgress)
.eraseToAnyPublisher(),
predictiveCacheManager: navigationProvider.predictiveCacheManager
)
)
NavigationMapView
Note: NavigationMapView has been moved into the MapboxNavigationCore library.
Initialize NavigationMapView using NavigationMapView.init(location: AnyPublisher<CLLocation, Never>, routeProgress: AnyPublisher<RouteProgress?, Never>, navigationCameraType: NavigationCameraType, heading: AnyPublisher<CLHeading, Never>?, predictiveCacheManager: PredictiveCacheManager?).
Those dependencies can be obtained from MapboxNavigation protocol.
An example of instantiating NavigationMapView:
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
NavigationMapView(
location: navigationProvider.navigation().locationMatching
.map(\.mapMatchingResult.enhancedLocation)
.eraseToAnyPublisher(),
routeProgress: navigationProvider.navigation().routeProgress
.map(\.?.routeProgress)
.eraseToAnyPublisher(),
heading: navigationProvider.navigation().heading,
predictiveCacheManager: navigationProvider.predictiveCacheManager
)
PreviewViewController
Initialize PreviewViewController using PreviewViewController.init(_: PreviewOptions). PreviewOptions requires you to provide
dependencies that can be obtained from MapboxNavigation protocol.
An example of instantiating PreviewViewController:
let navigationProvider = MapboxNavigationProvider(coreConfig: CoreConfig())
PreviewViewController(
PreviewOptions(
locationMatching: navigationProvider.navigation().locationMatching,
routeProgress: navigationProvider.navigation().routeProgress
.map(\.?.routeProgress)
.eraseToAnyPublisher(),
predictiveCacheManager: navigationProvider.predictiveCacheManager
)
)
Note: You need to start a free drive session by invoking SessionController.startFreeDrive() to receive map matching updates.