Skip to content

[menu-bar][cli] Add support for physical iPhones on Windows and Linux#347

Open
gabrieldonadel wants to merge 15 commits into
mainfrom
claude/nice-volta-oy4ioa
Open

[menu-bar][cli] Add support for physical iPhones on Windows and Linux#347
gabrieldonadel wants to merge 15 commits into
mainfrom
claude/nice-volta-oy4ioa

Conversation

@gabrieldonadel

Copy link
Copy Markdown
Member

Why

We should asupport installing apps in physical iPhones, not only in macOS but also in Windows and Linux

How

This PR adds cross-platform physical-device support by leveraging usbmux and Apple Mobile Device Service:

  • eas-shared now talks to the usbmux socket on all three OSes. macOS already ships usbmuxd; Linux activates it via socket/udev when a device is attached; Windows needs the Apple Mobile Device Service installed separately.
  • Added an iPhone row to the onboarding checklist on Windows. Clicking the warning icon opens an alert with a one-click "Install" button that runs winget install --id Apple.AppleMobileDeviceSupport, falls back to the Microsoft Store page if winget isn't available, then re-runs the checks so the row flips to a green check.
  • Show an "install Apple Mobile Device Support" button on the menu-bar if the user opens Orbit with an iPhone plugged in.(PowerShell Get-PnpDevice filtered by Apple's USB vendor id 05AC).
  • Updated Settings to enable iOS by default on Windows and Linux

Adjacent fixes:

  • tar extraction on Windows handles the busybox quirks that broke unpacking builds.
  • IPA opening on Linux now picks a sensible default rather than failing.
  • Fix Electron Alert custom onPress function

Test Plan

  • macOS: existing physical-iPhone flow still works (install, launch, no onboarding regression).
  • Windows, no iPhone plugged in: open Orbit, popover shows no "install Apple Mobile Device Support" prompt. Onboarding pre-flight still shows the row with a warning.
  • Windows, iPhone plugged in, no Apple Mobile Device Support installed: popover surfaces the install prompt. Onboarding row's warning icon opens an alert with an "Install Apple Mobile Device Support" button; clicking it kicks off winget, shows a spinner, and the row flips to a check on success.
  • Windows with winget unavailable: install button falls back to opening the Microsoft Store page.
  • Linux: plug in an iPhone, confirm device shows up. With usbmuxd stopped, error message tells the user to start it (not to reinstall).

claude and others added 13 commits June 16, 2026 15:06
Enable installing already-signed builds onto a USB-connected iPhone from
all three desktop platforms, without requiring a paid Apple account or Xcode.

The usbmux-based install transport already existed and is cross-platform; this
un-gates it from macOS/Xcode and surfaces it everywhere:

- eas-shared: make the developer disk image mount and app launch best-effort in
  runOnDevice (installation works without Xcode; launch is skipped on
  Windows/Linux). Discover devices via Promise.allSettled so a missing usbmux
  service surfaces a friendly, actionable error instead of crashing. Add a
  cross-platform usbmuxd availability check and per-OS helper-software guidance.
- cli: guard simulator-only paths behind process.platform === 'darwin' so
  list-devices and install-and-launch work for physical iPhones off macOS; add
  an install-apple-device-support command (winget on Windows, pkexec usbmuxd on
  Linux).
- menu-bar: add a "Show iOS devices" preference (on by default everywhere),
  list physical devices independently of simulators, and show an
  install-helper-software prompt when the Apple device service isn't reachable.
- common-types: add APPLE_DEVICE_USBMUXD_NOT_RUNNING / APPLE_DEVICE_NOT_PAIRED
  error codes and helper guidance on the device-list error.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
…eference

Drop the separate showIosDevices preference. The single showIosSimulators
toggle now controls the whole iOS section (simulators on macOS, physical
iPhones everywhere) and defaults ON / is enabled on all platforms so connected
iPhones are discoverable on Windows and Linux.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
…returns no devices

getConnectedDevicesAsync swallowed the usbmux "service not running" error on
Linux/Windows: the custom path already wraps the socket error as an
InternalError, but the guard only matched raw socket codes, and the native
devicectl path fulfils with [] off macOS, so the error was logged and dropped.
Re-throw user-facing InternalErrors from the custom path before the other
guards, and add a regression test.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
On Linux usbmuxd is socket/udev-activated and only runs while an Apple device is
attached, so an installed-but-stopped daemon previously produced the misleading
"install the usbmuxd daemon" guidance. Detect the installed binary and, when
present, tell the user to connect/trust the device or run
`sudo systemctl start usbmuxd` instead. Adds a `startCommand` to the helper
guidance, hides the menu-bar "Install" button when there's nothing to install,
updates the README, and covers both states with unit tests.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
Instead of opening a download page and asking the user to manually install
Apple's software, install the official, lightweight Apple Mobile Device Support
package (USB driver + device service only, no full iTunes/Apple Devices app) via
winget directly from the in-app prompt. Vendoring Apple's binaries isn't viable
(proprietary, signed kernel driver), so this uses Apple's official distribution.

- CLI install-apple-device-support: use winget id Apple.AppleMobileDeviceSupport
  with --silent; surface a clear error when winget is missing so the UI can fall
  back to the manual download page.
- Menu-bar prompt: run the install first (winget/pkexec) and only open the
  download page as a fallback; refresh the device list after a successful install.
- Update guidance text, README, and unit tests.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
On Windows/Linux first run, offer an opt-in to install the helper software
needed to install apps on a physical iPhone over USB, instead of leaving users
to discover it later.

- check-tools CLI reports a cross-platform `appleDevice` entry (usbmux
  availability via validateAppleDeviceRequirementsAsync) carrying the same
  install guidance the popover prompt uses.
- Onboarding shows an "Install apps on a physical iPhone?" section (Windows/Linux
  only, when the tooling is missing) reusing AppleDeviceHelperPrompt; after a
  successful install it re-runs the checks so the prompt clears.

https://claude.ai/code/session_01TeUZg8NkPKBJN2RRQfAh3o
@gabrieldonadel gabrieldonadel requested a review from tsapeta June 17, 2026 17:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants