anthropics / anthropics/claude-code
[BUG] Claude can no longer control MacOS Simulator after 27 update
- Dominant language
- Python
- Stars
- 145k
- Forks
- 23.1k
- PR merge metrics
- PR metrics pending
Description
### Preflight Checklist
- [x] I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) 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?
## Summary
iOS Simulator control in Claude Code (desktop app) receives no synthetic input (tap/swipe) after upgrading to macOS 27.0 / Xcode 27.0. Screenshot capture, hardware button presses, and `launch` all work correctly — only touch/gesture injection into the simulator is affected.
## Environment
- macOS 27.0 (build 26A428)
- Xcode 27.0 (build 27A266a)
- Device tested: iPhone 17 Pro simulator (iOS 26.5 runtime)
- Also reproduces on iPhone 17 Pro Max / other iOS 26.5-paired devices in the same runtime
## Symptom
- `screenshot` succeeds reliably and reflects real, current simulator state (clock ticks forward, app content is correct).
- `button` (hardware HOME) works — backgrounds the app as expected.
- `launch` (both via the tool and via `xcrun simctl launch`) succeeds and the app UI renders correctly.
- `tap` and `swipe` calls return success (no error from the tool) but produce **no effect whatsoever** in the simulator — no visual change, no state change, confirmed via before/after screenshot diffing across dozens of attempts.
- Fails on the very first interaction of a completely fresh app/simulator state, not just after prolonged use.
## What's been ruled out
1. **Stale simulator/app state** — reproduces identically on a freshly booted simulator with the app freshly installed (not just relaunched).
2. **Multiple competing booted simulators** — reproduces with only one simulator booted at a time.
3. **App-level session/cache state** — reproduces on a completely fresh install with no prior data.
4. **Claude app process state** — reproduces after quitting and relaunching the Claude desktop app.
5. **Simulator daemon state** — reproduces after a full `simctl shutdown` + `simctl boot` cycle.
6. **Full machine restart** — reproduces identically immediately after a full macOS restart.
7. **macOS Privacy & Security permission** — `Device Control and Data Access` (the renamed successor to the old Accessibility permission in macOS 27) already had Claude granted; toggled off and back on, restarted Claude, reproduces identically.
8. **Coordinate/calibration error** — tried many different coordinates across the full screen (not just one region), including known-good reference points (e.g., search bar tap that worked in a prior session before this issue began); all fail identically post-upgrade.
## Working theory
This began immediately after updating macOS and Xcode to the versions above (same session, prior interactions with the identical simulator/tool worked normally before the update). Given screenshot capture and hardware-button injection still work but touch/gesture injection does not, this looks like a compatibility break between the Claude app's touch-injection mechanism (likely CGEvent-based or a CoreSimulator IO framework call) and something that changed in macOS 27 / Xcode 27 — a private API signature change, a new entitlement requirement, or a CoreSimulator protocol version bump — rather than a permissions or environment-state issue.
## Impact
Blocks all live UI testing/interaction with iOS apps in the Simulator via Claude Code. Screenshot-only verification and code review remain possible but cannot substitute for interactive testing (tapping buttons, filling forms, confirming dialogs, etc.).
### What Should Happen?
## What should happen
`tap`/`swipe` calls to the iOS Simulator should register real touch events in the simulator, the same as they did before the macOS 27 / Xcode 27 update — e.g., tapping "Accept" on a Terms-of-Service screen should dismiss it and reveal the next screen, and tapping a tab-bar item should switch tabs. Screenshot output should reflect that state change on the next call.
Concretely: tapping the "Accept" button at its correct on-screen coordinates (verified via screenshot) should complete the terms-acceptance flow and give visible feedback in the *following* screenshot, either terms accepted and the underlying app usable, or a new UI. Instead the screen is bit-for-bit identical after the tap.
### Error Messages/Logs
```shell
```
### Steps to Reproduce
## Steps to reproduce
1. Update macOS and Xcode to the versions in the Environment section above (macOS 27.0 build 26A428, Xcode 27.0 build 27A266a).
2. In Claude Code, boot an iOS Simulator device (e.g. `xcrun simctl boot `, or let the tool boot it).
3. Attach to it via the iOS Simulator tool's `attach` action.
4. Call `screenshot` — confirm it returns a correct, current image of the simulator (e.g. the Home Screen or whatever app is in front).
5. Note the on-screen coordinates (in device points) of any visible, tappable control — for example, an app icon on the Home Screen, or a button inside an app.
6. Call `tap` with those exact coordinates.
7. Call `screenshot` again.
## Actual result
The second screenshot (step 7) is identical to the first (step 4) — the tapped control shows no effect: no app launched, no button state change, no navigation. This holds regardless of which control is tapped, which app is in front, or whether the simulator/app was freshly booted/installed moments before.
Other input types remain unaffected for comparison:
- `button` with `name: HOME` correctly backgrounds the front app (visible in the next screenshot).
- `launch` correctly installs/launches an app (visible in the next screenshot).
- `swipe` shows the same failure as `tap` — no scroll, no gesture effect.
## Minimal isolation already performed
Repeating steps 2–7 after each of the following still reproduces the identical failure:
- A freshly booted simulator (`simctl shutdown` + `simctl boot`) with no other simulator concurrently booted.
- A freshly installed app with no prior data/session state.
- Restarting the Claude desktop app.
- A full macOS restart.
- Toggling `Device Control and Data Access` off and back on in System Settings → Privacy & Security (was already granted to Claude beforehand).
None of the above changes the outcome — steps 4–7 fail identically every time.
### Claude Model
None
### Is this a regression?
Yes, this worked in a previous version
### Last Working Version
_No response_
### Claude Code Version
Claude 2.110.1 (ae8d2a) 2026-09-17T03:04:01.000Z
### Platform
Anthropic API
### Operating System
macOS
### Terminal/Shell
Terminal.app (macOS)
### Additional Information
_No response_
Contributor guide
No contributing guide indexed for this repository
Research direction
Reproduce the failure with the iOS Simulator tool using attach, screenshot, tap, swipe, button, and launch, following the listed macOS 27.0 and Xcode 27.0 steps; compare tap/swipe with button and launch. Investigate the touch-injection path and the xcrun simctl behavior. Done means tap and swipe change the simulator state and the next screenshot reflects that change without regressing the working actions.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- ios, macos
- Domain
- desktop-dev, mobile-dev
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100