Bug Description
During React Native development reloads (e.g. CMD+R or fast refresh), the app crashes on iOS because callback methods in NavModule.mm attempt to emit events through the React Native bridge after it has been invalidated/torn down.
The crash occurs because navigation callbacks (onLocationChanged, onArrival, onRemainingTimeOrDistanceChanged, onRouteChanged, onReroutingRequestedByOffRoute, onStartGuidance, onTurnByTurn) continue to fire after the bridge is destroyed during reload, and the emit* calls throw exceptions when the bridge is unavailable.
Steps to Reproduce
- Start a React Native app using
@googlemaps/react-native-navigation-sdk on iOS
- Begin an active navigation session (so callbacks are firing)
- Trigger a development reload (CMD+R or save a file with fast refresh)
- App crashes
Expected Behavior
The app should gracefully handle the bridge being unavailable during reload without crashing.
Suggested Fix
Wrap each emit* call in the INavigationCallback methods in NavModule.mm with a try-catch block to silently ignore exceptions when the bridge is invalid during reload. The affected methods are:
onLocationChanged:
onArrival:
onRemainingTimeOrDistanceChangedWithNavigator:
onRouteChanged
onReroutingRequestedByOffRoute
onStartGuidance
onTurnByTurn:
Example fix for one method:
- (void)onLocationChanged:(NSDictionary *)mappedLocation {
try {
[self emitOnLocationChanged:@{@"location" : mappedLocation}];
} catch (...) {
// Bridge may be invalid during dev reload - ignore to prevent crash
}
}
The same pattern applies to all 7 callback methods listed above.
Environment
- SDK version: 0.14.1
- Platform: iOS
- React Native: 0.76+
Bug Description
During React Native development reloads (e.g. CMD+R or fast refresh), the app crashes on iOS because callback methods in
NavModule.mmattempt to emit events through the React Native bridge after it has been invalidated/torn down.The crash occurs because navigation callbacks (
onLocationChanged,onArrival,onRemainingTimeOrDistanceChanged,onRouteChanged,onReroutingRequestedByOffRoute,onStartGuidance,onTurnByTurn) continue to fire after the bridge is destroyed during reload, and theemit*calls throw exceptions when the bridge is unavailable.Steps to Reproduce
@googlemaps/react-native-navigation-sdkon iOSExpected Behavior
The app should gracefully handle the bridge being unavailable during reload without crashing.
Suggested Fix
Wrap each
emit*call in theINavigationCallbackmethods inNavModule.mmwith a try-catch block to silently ignore exceptions when the bridge is invalid during reload. The affected methods are:onLocationChanged:onArrival:onRemainingTimeOrDistanceChangedWithNavigator:onRouteChangedonReroutingRequestedByOffRouteonStartGuidanceonTurnByTurn:Example fix for one method:
The same pattern applies to all 7 callback methods listed above.
Environment