anthropics / anthropics/claude-code

[BUG] Claude can no longer control MacOS Simulator after 27 update

Open
#95,140 0 comments 0 reactions 0 assignees View on GitHub
area:tools bug has repro platform:macos regression
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.