[BUG] iOS Simulator tool: tap actions silently fail or land out of order while screenshot stays reliable
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Title
iOS Simulator tool: tap frequently fails to register or lands several taps late, while screenshot stays reliable
Environment
- macOS 26.7 (build 25G229)
- Xcode 26.2 (also had Xcode 27.0 installed side-by-side)
- iOS Simulator runtime 26.3.1
- Device: iPhone 17 Pro (simulator)
- Claude Code desktop app, using the
mcp__Claude_Code_iOS_Simulator__controltool (attach,tap,screenshot,textactions)
Summary
During a long simulator-testing session, the tap action became highly unreliable: most taps silently failed to register in the app, while screenshot continued to work correctly and consistently. This persisted across multiple detach/attach cycles, full simulator reboots (xcrun simctl shutdown + boot), restarting the CoreSimulatorService background daemon, and restarting the claude-ios-sim helper process.
Observed behavior
- A
tapcall returns success (Tapped at (x, y) on <device>), but the subsequentscreenshotshows no change in the UI. - Occasionally, a tap would appear to "catch up" several actions later — e.g. tapping a list item would open a previously tapped row instead of the one just requested, suggesting taps were being queued and delivered out of order / with significant lag, rather than uniformly dropped.
- Separately, the
textaction reliably triggered the React Native Dev Menu (the app's shake-gesture debug menu) instead of typing into a focused text field — happened consistently across multiple attempts on different screens. screenshotitself failed intermittently withcaptureFailedafter simulator reboots, recoverable by killing and letting theclaude-ios-simhelper process respawn (via macOSpkill -f claude-ios-simthen callingattachagain).
What I ruled out
- Target size/precision — taps failed even on large, isolated, unambiguous targets (e.g. a full-width "Back" button in the nav bar), not just small/adjacent UI elements.
- Conflict with the standalone Simulator.app — I had manually opened the stock
Simulator.app(from Xcode's ownApplicationsfolder) pointed at the same device UDID, wondering if a second GUI window might help. Taps were still unreliable with it open. When I then quit thatSimulator.appprocess, the nexttapcall from the Claude tool immediately failed withtap failed: clientDisposed— indicating the tool's HID client was coupled to (or dependent on) that separate process's lifecycle at that moment. Re-attaching afterward reset the connection, but tap reliability did not improve withSimulator.appclosed either.
Suspected trigger (not confirmed causal)
Earlier in the same session, I had killed and let respawn CoreSimulatorService and the claude-ios-sim helper process multiple times while working around an unrelated Xcode-version conflict (an iOS 27.0 vs 26.2 SDK/runtime mismatch). Tap reliability degraded sometime after that, though I could not pin down an exact reproducible trigger — it's possible one of those restarts left the HID injection channel (as opposed to the screen-capture channel, which kept working) in a bad state that only a full Claude desktop app restart would clear (a full app restart did restore screenshot and attach functionality once, but tap reliability remained poor afterward).
Impact
Made autonomous UI testing/navigation in the simulator effectively unusable for the rest of the session — had to hand off all tap interactions to the human user, who could interact with the same simulator panel reliably via direct mouse clicks (real OS input, not the tool's synthesized HID injection).
Suggested investigation areas
- Whether the tool's HID tap-injection path can get desynchronized from the screen-capture path (they're clearly using different underlying mechanisms, since only one degraded).
- Whether
CoreSimulatorServicerestarts mid-session can leave the tap-injection client in the tool's helper process (claude-ios-sim) in a stale state that isn't detected/recovered automatically (onlyscreenshotfailures triggered an obvious recoverable error;tapfailures were silent). - Whether attaching a second, independent client (standalone
Simulator.app) to the same device UDID as the tool's own client can cause the kind of coupling seen in theclientDisposederror.
What Should Happen?
For a "What should happen?" field, keep it short and factual:
tapactions should reliably register in the simulator every time they're sent, and should apply immediately/in order — not fail silently, and not queue up and land several taps late. Tap reliability should match the reliability already seen withscreenshot, which worked consistently throughout the same session.
Error Messages/Logs
Steps to Reproduce
Here's a "Steps to Reproduce" section:
- Attach the iOS Simulator tool to a booted simulator device and confirm
tap+screenshotwork normally. - Over the course of the session, restart the
CoreSimulatorServicebackground daemon multiple times (pkill -f CoreSimulatorService) — e.g. to recover from a device-not-found issue. Each restart shuts down booted simulators. - Each time, reboot the simulator (
xcrun simctl boot <udid>) and re-runattach. - Continue using
tapandscreenshotfor app testing/navigation. - At some point after several such cycles,
tapcalls return success but produce no visible change —screenshotright after shows the UI unchanged. - Retrying the same tap repeatedly sometimes eventually registers, sometimes with a multi-tap delay (a tap opens a screen corresponding to an earlier tap, not the most recent one) — suggesting taps queue and deliver late/out of order rather than drop outright.
- Restarting the
claude-ios-simhelper process (pkill -f claude-ios-sim, thenattachagain) doesn't restore tap reliability, though it reliably fixesscreenshotfailures (captureFailed) when those occur. - Fully quitting/reopening the Claude desktop app restores
screenshot/attachcleanly, but tap reliability remains degraded afterward.
Note: I wasn't able to reduce this to a minimal, deterministic repro — it degraded gradually over a long session rather than from one clear trigger. The CoreSimulatorService restarts (step 2) are the most likely suspect since that's the main unusual thing done beforehand, but this isn't confirmed causal.
Claude Model
None
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.2553.1
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_