Shopify / Shopify/react-native-skia

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

Open
#4,006 5 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
8.6k
Forks
647
Avg merge
1d 17h
Merged PRs (30d)
35

Description

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.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reviewing the apple/ and cpp/ source changes between Skia 2.2.12 and 2.4.21, then trace the JS ResponderEventPlugin around trackedTouchCount, topTouchCancel, and topSelectionChange. Use an instrumented real-device build with prolonged usage to reproduce the event sequence. Done means the first tap reaches TouchableOpacity Pressability while the keyboard is open, without regressing the older Skia behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, ios, react-native, typescript
Domain
computer-graphics, frontend, mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.