Rerouting is when a new route is generated after the user's progress along a route has already begun. There are a few reasons rerouting happens including the user going off-route and the Navigation SDK determining there is a faster route to the next waypoint from the user's current location.
The Navigation SDK provides information about whether a user's device is on the route that was generated. If a user is off-route, you can provide additional instruction to the user and generate a new route.
By default, if a user is off-route, a new route is generated from their current location to the next waypoint.
NavigationServiceDelegate.navigationService(_:willRerouteFrom:) is called and
Notification.Name.routeControllerWillReroute is posted after the SDK detects the need for a reroute but before receiving the new route. Then
NavigationServiceDelegate.navigationService(_:didRerouteAlong:at:proactive:) is called and
Notification.Name.routeControllerDidReroute is posted once you receive the new route. You can use these methods to customize built-in behavior and synchronize your application behavior with what's happening with navigation logic.
You can also preempt rerouting on a case-by-case basis using the
NavigationServiceDelegate.navigationService(_:shouldRerouteFrom:) delegate method.
By default, the Navigation SDK checks for a faster route every two minutes by making a request to the Direction API and comparing the response to the current route.
You can customize the interval at which to check for a faster route by setting the
RouteControllerProactiveReroutingInterval global variable. You can opt-out of faster-route detection by setting
navigationService.router.reroutesProactively = false