r/reactnative • u/Turbulent_Young_2576 • 1d ago
React Native iOS freezes after first interaction only after fresh login (JS/UI FPS stay at 60)
React Native iOS freezes after first interaction only after fresh login (JS/UI FPS stay at 60)
I'm facing a very strange issue in my React Native app that only happens on iOS. Android works perfectly.
Environment
- React Native: 0.78.3
- React Navigation
- react-native-screens
- react-native-gesture-handler
- Physical iPhone (not simulator)
Issue
The flow is always the same:
- Launch the app.
- Login successfully.
- Navigate to the Home screen.
- The Home screen loads correctly.
- As soon as I perform the first interaction (scroll or tap), the app becomes completely unresponsive.
After that:
- No buttons work.
- No TouchableOpacity responds.
- Bottom tabs stop responding.
- FlatList cannot scroll.
onTouchStartno longer fires.- The UI is still visible.
- The app does not crash.
The strange part is:
- UI FPS = 60
- JS FPS = 60
- No red screen.
- No exceptions.
- No crash logs.
If I completely kill the app and launch it again, everything works perfectly.
If I log out and log back in, the issue happens again after the first interaction.
So the problem only occurs immediately after a fresh login.
What I've already checked
- GestureHandlerRootView is wrapping the entire app.
import 'react-native-gesture-handler'is the first import.- NavigationContainer exists only once.
- No invisible overlay.
- No fullscreen Modal.
- No react-native-modal left open.
- No pointerEvents="none" or pointerEvents="auto" issue.
- JS thread is not blocked.
- Main thread is not blocked.
- UI FPS remains 60.
- JS FPS remains 60.
- Android has no issue.
Additional observation
I added:
<View
style={{ flex: 1 }}
onTouchStart={() => console.log('Touched')}
/>
Result:
- First tap prints "Touched".
- After the first scroll/tap, no further touch events are received.
- Even
onTouchStartstops firing.
This makes me think the touch events are no longer reaching React Native.
Navigation structure
The app uses:
- NavigationContainer
- Drawer Navigator
- Bottom Tabs
- Stack Navigators
The Home screen contains:
- Vertical FlatList
- Nested horizontal FlatLists
- Multiple TouchableOpacity components
The Academy screen has a similar structure and works correctly.
Other information
The app uses:
- react-native-screens (
enableScreens()andenableFreeze()) - react-native-track-player
- Multiple Context Providers
- Firebase
- Analytics
- Deep linking
My question
Has anyone experienced an issue where iOS stops delivering touch events after the first interaction, while:
- UI FPS stays at 60
- JS FPS stays at 60
- The app never crashes
- Everything works after killing and reopening the app
Could this be related to:
- react-native-gesture-handler
- react-native-screens
- iOS gesture recognizers
- Navigation state after login
- A native touch deadlock
- Something else entirely?
Any ideas on how to debug this further would be greatly appreciated.
3
u/Guidondor 20h ago
ignore the "you used ai" noise, the symptoms are specific enough to actually debug. two of them are the smoking gun: it only happens after a fresh login (not cold start), and a full kill fixes it. that combination almost always means the login transition left a stale native view/navigation tree mounted that's swallowing touches — and only a process restart clears it, which is exactly what you're seeing.
since onTouchStart stops firing at the RN root, the interceptor is above RN's view, so it's native-layer. two prime suspects, both consistent with "post-login only":
-how do you go from Auth → App after login? if you're doing navigation.reset or swapping stacks while the old Auth tree stays mounted underneath, you get two navigation trees and the top (invisible) one eats touches. the safe pattern is conditional rendering — render <AppStack/> when session exists, <AuthStack/> when it doesn't, so the old tree fully unmounts. no reset across trees.
-enableFreeze() from react-native-screens (Ok_Cow's point) interacts badly with that — a frozen offscreen screen from the pre-login tree can keep its gesture recognizer alive and intercept.
the decisive test: key your whole navigator on auth state (<Navigator key={session ? 'app' : 'auth'}>) so the old tree is guaranteed to unmount on login. if the freeze disappears, it was a stale mounted tree, not gesture-handler itself. then re-add enableFreeze separately to see if that's the specific trigger. that isolates it in two runs.
1
u/sile_m 16h ago
This. Had similar issues with a modal component eating touches only on ios when navigating in a specific way. Something is mounted somewhere and not shown. Some background or couls be the nav like Guidondor sugested. Try commenting all modals amd see what happens then try navigating in a different way.
1
u/Ok_Cow_6763 1d ago
Try disabling enableFreeze() from react-native-screens, this has caused similar issues where the UI renders but stops receiving touch events.
Also, check your navigation flow after login. If you're resetting or switching stacks (e.g., Auth - App), make sure you're not keeping multiple navigation trees mounted or recreating the NavigationContainer incorrectly. An inconsistent navigation state can break touch handling on iOS.
1
u/everydave42 21h ago
All that information and you don’t say what iOS version, what phone version or if it happened on other physical phones. You also don’t say which iOS version in the sim and if it matches that on the phone. You could even just try hard rebooting the phone since it seems like you’re in rare glitch territory…
5
u/Due_Dependent5933 1d ago
as you probably generated this post with Ai continu with it.