Summary
The app crashes (EXC_CRASH / SIGABRT) inside RerouteController.__deallocating_deinit,
reached from MapboxNavigator.fallbackToOffline(_:), when the router switches
online→offline mid-trip. With the default routingProviderSource = .hybrid, this
fires intermittently on spotty cellular connectivity a few seconds into active guidance.
Environment
- mapbox-navigation-ios: v3.25.1 (MapboxNavigationCore)
- iOS 26 (device: iPhone 17), Xcode 26 / Swift 6, strict concurrency = complete
- Debug build on a physical device
Crash (symbolicated, main thread)
abort()
swift::fatalErrorv(...)
swift_deallocClassInstance.cold.1
swift_deallocClassInstance
RerouteController.__deallocating_deinit
swift_release_dealloc
closure #1 in MapboxNavigator.fallbackToOffline(:)
RerouteController.deinit calls navigator?.removeRerouteObserver(for: self); the
release happens inside the Task { @MainActor … } in fallbackToOffline, which
reassigns rerouteController = configuration.navigator.rerouteController, deallocating
the previous instance.
Steps to reproduce
- Use default
CoreConfig (i.e. RoutingConfig.routingProviderSource == .hybrid).
- Start active guidance.
- Drive/test in an area with intermittent connectivity so the SDK toggles
online↔offline (navigationDidSwitchToFallbackVersion).
- App aborts within a few seconds, in the reroute-controller teardown.
Expected
Switching between online and offline routing should not crash.
Actual
fatalError during RerouteController deallocation → SIGABRT.
Workaround
Setting routingConfig: RoutingConfig(routingProviderSource: .online) avoids the
fallback path and the crash at the cost of offline routing.
Summary
The app crashes (EXC_CRASH / SIGABRT) inside
RerouteController.__deallocating_deinit,reached from
MapboxNavigator.fallbackToOffline(_:), when the router switchesonline→offline mid-trip. With the default
routingProviderSource = .hybrid, thisfires intermittently on spotty cellular connectivity a few seconds into active guidance.
Environment
Crash (symbolicated, main thread)
abort()
swift::fatalErrorv(...)
swift_deallocClassInstance.cold.1
swift_deallocClassInstance
RerouteController.__deallocating_deinit
swift_release_dealloc
closure #1 in MapboxNavigator.fallbackToOffline(:)
RerouteController.deinitcallsnavigator?.removeRerouteObserver(for: self); therelease happens inside the
Task { @MainActor … }infallbackToOffline, whichreassigns
rerouteController = configuration.navigator.rerouteController, deallocatingthe previous instance.
Steps to reproduce
CoreConfig(i.e.RoutingConfig.routingProviderSource == .hybrid).online↔offline (
navigationDidSwitchToFallbackVersion).Expected
Switching between online and offline routing should not crash.
Actual
fatalErrorduringRerouteControllerdeallocation → SIGABRT.Workaround
Setting
routingConfig: RoutingConfig(routingProviderSource: .online)avoids thefallback path and the crash at the cost of offline routing.