How to install apps in Xcode's iOS simulator on Mac OS?

Installing applications into Xcode's iOS Simulator is a direct process that leverages the simulator's role as a self-contained runtime environment for iOS, iPadOS, tvOS, and watchOS. The primary and most common method is to build and run an app directly from your Xcode project. After opening your project, you select your desired simulator model and OS version from the scheme menu in the Xcode toolbar. Clicking the "Run" button (or pressing Cmd+R) compiles the application for the selected simulator architecture and automatically installs and launches it. The compiled .app bundle is placed within the simulator's unique data directory for that device type, managed by CoreSimulator. This is the fundamental workflow for developers testing their own code, as the simulator executes x86_64 or ARM64 code compiled specifically for the macOS-hosted simulator runtime, not for physical ARM-based devices.

For installing pre-compiled applications not built from your active Xcode project, such as third-party .ipa files, the procedure is more manual but feasible. You cannot simply double-click an .ipa file intended for a physical device, as it contains ARM binaries. Instead, you need a version built for the simulator architecture. If you have such an app bundle (a .app directory), you can install it via the `simctl` command-line tool, which is part of Xcode's developer utilities. The command `xcrun simctl install booted /path/to/YourApp.app` will install the application onto the currently booted simulator. Alternatively, you can target a specific simulator by its device UDID, which you can find by running `xcrun simctl list devices`. This method is often used for distributing internal builds or testing libraries packaged as dynamic frameworks within a demo app.

Beyond command-line installation, you can also interact with the simulator's installed applications directly through its file system. The installed apps reside in a directory structure within `~/Library/Developer/CoreSimulator/Devices/`. Each simulator device has a unique UUID, and within its `data/Containers/Bundle/Application/` directory, you will find the installed .app bundles. While you can manually copy an .app bundle into this directory, using `simctl` is the supported method as it ensures proper registration with the simulator's launch services. Once an app is installed by any method, its icon will appear on the simulator's home screen. If it does not appear immediately, you may need to restart the simulator or trigger a refresh by running `xcrun simctl launch booted com.example.appidentifier`.

The simulator is designed as a developer tool, not a general-purpose app player, which imposes key limitations. It cannot run App Store .ipa files downloaded from consumer sources, as those contain incompatible binaries and are cryptographically signed for physical devices. The installation mechanisms described are integral to the development and QA cycle, allowing for rapid iteration and testing of user interface layouts, Core Data stacks, and other iOS frameworks that are largely identical to their device counterparts. Mastery of both the Xcode-integrated run process and the `simctl` utilities provides flexibility for various testing scenarios, from unit tests of a single component to user acceptance testing of a complete, pre-packaged build.