iOS Fabric: first tap on a Touchable is lost while keyboard is open — regression between 2.2.12 and 2.4.21, still present in 2.11.0

Author: belcrod5Created Aug 16, 2026Updated Aug 29, 2026

Description

On a real device (iPhone 14 Pro, iOS 26.3.1, RN 0.81.x, New Architecture/Fabric), after using the app for a while, the first tap on a TouchableOpacity (send button) next to a focused multiline TextInput is silently consumed while the software keyboard is open: the keyboard closes, but the button's Pressability never fires (onPressIn/onPress are not reached). The second tap works. The Skia canvas lives on a different screen — the symptom occurs on a screen with no canvas mounted, after the canvas screen was used earlier in the session.

Bisection (device A/B, each configuration soak-tested with prolonged real usage)

Configuration Result
App @ commit before Skia upgrade (Skia 2.2.12) no repro
Same commit + only @shopify/react-native-skia 2.2.12 → 2.4.21 repro
Latest app + Skia 2.11.0 (latest) repro
Latest app + Skia pinned to 2.2.12 no repro

Downgrading react-native 0.81.6 → 0.81.5 did not help, so it does not look RN-version specific.

Notes

  • Diffing the package's apple/ and cpp/ sources between 2.2.12 and 2.4.21 shows no touch/gesture/recognizer changes, so we suspect a rendering/threading timing change surfaces a React Native Fabric responder negotiation issue rather than a direct touch-handling bug.
  • During diagnosis we observed the JS ResponderEventPlugin's trackedTouchCount being left at 1 after a batched topTouchCancel: two topTouchStart events followed by a single topTouchCancel whose nativeEvent.touches.length is 0 (the plugin decrements only once per cancel event). After that, topSelectionChange lets the focused TextInput become responder, and the next tap on the button is never granted the responder.
  • Environment: react-native 0.81.5/0.81.6, react-native-gesture-handler ~2.28, react-native-reanimated ~4.1, react-native-worklets 0.5.1–0.7.4, react-native-keyboard-controller ^1.21.7, Expo SDK 54, newArchEnabled: true.

We don't have a minimal reproduction yet (it needs prolonged usage to trigger), but we can provide more details or run instrumented builds if helpful.

Source: Shopify/react-native-skia