-
Notifications
You must be signed in to change notification settings - Fork 27
Description
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-sdkon 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:onRouteChangedonReroutingRequestedByOffRouteonStartGuidanceonTurnByTurn:
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+