Xcode Simulator es una herramienta integrada de Apple que ejecuta aplicaciones iOS en un Mac sin necesidad de un dispositivo físico. El simulador compila el código para la arquitectura x86_64 del host, lo que proporciona una alta velocidad de prueba. Documentación de Apple describe el ciclo completo de depuración usando el simulador para iPhone, iPad, Apple Watch y Apple TV.
Puntos clave
Xcode Simulator es una herramienta para ejecutar y depurar aplicaciones iOS directamente en un Mac. A diferencia del emulador de Android, el simulador de Apple no emula el procesador ARM del dispositivo. En su lugar, el código se compila en código máquina de la arquitectura del host (x86_64 en Intel Mac o arm64 en Apple Silicon).
El simulador utiliza los frameworks de iOS directamente desde el SDK, proporcionando acceso a UIKit, SwiftUI, Foundation y Core Data. Según Apple (WWDC 2024), más del 90% de los desarrolladores usan el simulador durante la etapa de desarrollo, conectando dispositivos físicos solo para las pruebas finales.
Cada versión de Xcode incluye un conjunto de simuladores para diferentes modelos de dispositivos y versiones de iOS. Por ejemplo, Xcode 16 incluye simuladores para iPhone 16 Pro con iOS 18, iPad Pro M4 con iPadOS 18, Apple Watch Series 10 y Apple TV 4K.
El simulador se instala junto con Xcode desde Mac App Store. Para agregar versiones adicionales de iOS, use el menú Settings → Platforms. Seleccione un simulador en el esquema de compilación (Scheme) y presione Run. Alternativamente, ejecute el simulador a través del menú Xcode → Open Developer Tool → Simulator.
// Verificación de la versión mínima de iOS para el simulador
if #available(iOS 18.0, *) {
print("API de iOS 18 disponibles")
}Comprender las diferencias entre el simulador y un dispositivo real es fundamental para realizar pruebas de calidad. Las principales diferencias radican en la arquitectura del procesador, las capacidades del hardware y el rendimiento gráfico.
| Característica | Simulador | Dispositivo real |
|---|---|---|
| Arquitectura de CPU | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Simulación a través de GPU Mac | GPU Apple nativa |
| Cámara | No disponible | Completa |
| Acelerómetro/Giroscopio | No disponible | Sensores de hardware |
| Touch ID / Face ID | Simulación a través del menú | Biometría de hardware |
| Notificaciones push | Desde Xcode 11.4 (archivo .apns) | Servidor APNs |
| Bluetooth LE | No compatible | Pila completa |
El rendimiento en el simulador suele ser superior al de un dispositivo real, ya que utiliza el potente procesador del Mac. Esto crea una falsa impresión de velocidad. Las animaciones, las operaciones con Core Data y las solicitudes de red en un dispositivo real pueden funcionar más lentamente.
Asegúrese de ejecutar la aplicación en un dispositivo real antes del lanzamiento. Escenarios críticos: cámara y AVFoundation, Bluetooth y CoreBluetooth, notificaciones push a través de APNs, operaciones del sistema de archivos en App Sandbox, rendimiento de gráficos en Metal y consumo de energía de la batería.
Para la compilación condicional de código para el simulador, Apple proporciona TARGET_OS_SIMULATOR en Objective-C y targetEnvironment(simulator) en Swift. Esta verificación permite agregar registros de depuración, objetos simulados o deshabilitar código dependiente del hardware.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Simulador: usando cámara simulada")
#else
setupRealCameraSession()
#endif
}
}En Objective-C, la directiva #if TARGET_OS_SIMULATOR funciona de manera similar. Úsela para deshabilitar el código que requiere sensores de hardware o cámara. En el momento de la compilación para el simulador, este código no se incluye en el archivo binario.
#if TARGET_OS_SIMULATOR
NSLog(@"Ejecución en simulador — cámara no disponible");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifLa verificación TARGET_OS_SIMULATOR se utiliza en tres casos: sustituir la cámara por un objeto simulado durante las pruebas de UI, deshabilitar Core Bluetooth para acelerar el desarrollo y registrar información de depuración que no debe llegar a la compilación de publicación. Evite usar la verificación para cambiar la lógica de negocio, ya que esto puede provocar errores en un dispositivo real.
Xcode Simulator admite el conjunto completo de pruebas XCTest: pruebas unitarias (XCTestCase), pruebas de UI (XCUITestCase) y pruebas de rendimiento. Las pruebas en el simulador no requieren un certificado de desarrollador firmado, lo que simplifica la configuración de CI/CD.
import XCTest
final class LoginTests: XCTestCase {
var app: XCUIApplication!
override func setUp() {
continueAfterFailure = false
app = XCUIApplication()
app.launch()
}
func testLoginButtonExists() {
XCTAssertTrue(app.buttons["loginButton"].exists)
}
func testEmptyEmailValidation() {
app.textFields["emailField"].tap()
app.buttons["loginButton"].tap()
let errorLabel = app.staticTexts["errorMessage"]
XCTAssertTrue(errorLabel.exists)
}
}Para ejecutar pruebas desde la línea de comandos, use xcodebuild test especificando el esquema y el simulador. El parámetro -destination define el simulador específico en el que se ejecutarán las pruebas.
# Ejecución de pruebas unitarias en simulador iPhone 16, iOS 18
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"A pesar de su comodidad, Xcode Simulator tiene una serie de limitaciones que pueden provocar errores en un dispositivo real. La más crítica es la falta de emulación ARM: el código se compila para la arquitectura del host y el comportamiento de algunas operaciones puede diferir.
Core Data y el sistema de archivos funcionan más rápido en el simulador debido al SSD del Mac. En un dispositivo real con memoria NAND, la velocidad de lectura/escritura es menor. Pruebe el rendimiento de Core Data en un dispositivo antes del lanzamiento, especialmente para conjuntos de datos grandes.
La verificación del consumo de energía en el simulador es imposible: el simulador se alimenta del Mac. Los modos en segundo plano, incluida la carga de contenido y las operaciones de fetch, se comportan de manera diferente en un dispositivo real debido a las limitaciones de la batería y al Background Task Scheduler.
El simulador no tiene acceso a los sensores de hardware del iPhone. Face ID y Touch ID se pueden simular a través del menú del simulador: Features → Face ID → Matching Face. El acelerómetro, el giroscopio y el barómetro no están disponibles; el código que depende de CMDeviceMotion debe probarse en un dispositivo. Para Core Location, puede establecer coordenadas mediante Debug → Simulate Location seleccionando un archivo GPX.
La verificación de iCloud y StoreKit en el simulador también es limitada. StoreKit Test permite simular compras sin un App Store Connect real, pero la verificación del entorno Sandbox y las compras de producción requiere un dispositivo físico. La sincronización de iCloud Drive y CloudKit en el simulador funciona incorrectamente; Apple recomienda probar estos escenarios solo en dispositivos reales.
En Mac con procesadores de la serie M, el simulador funciona de manera fundamentalmente diferente: el código se compila en ARM64 nativo, como en un iPhone real, en lugar de x86_64. Esto reduce significativamente la brecha entre el simulador y el dispositivo. Las aplicaciones que se ejecutan en el simulador Apple Silicon usan las mismas instrucciones ARM que en un iPhone físico, lo que hace que las pruebas de rendimiento sean más representativas. La diferencia en el rendimiento de Metal y Core Animation entre el simulador de la serie M y un iPhone real es mínima en comparación con el simulador Intel.
La configuración de un simulador para CI requiere crear previamente el dispositivo y la versión de iOS necesarios. En los servidores de integración continua, los simuladores no se crean automáticamente; deben agregarse mediante xcrun simctl create antes de ejecutar las pruebas.
# Crear simulador para CI
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Ejecutar pruebas en el simulador creado
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"Para pruebas en paralelo en CI, configure varios simuladores con diferentes versiones de iOS. Xcode Cloud, GitHub Actions y Bitrise admiten la ejecución paralela de pruebas, lo que reduce el tiempo de ejecución entre 2 y 3 veces. Asegúrese de que todos los simuladores de iOS necesarios para las pruebas estén instalados en el servidor CI.
Preguntas frecuentes
El simulador funciona en la arquitectura x86_64 y usa la CPU del Mac, mientras que un dispositivo real funciona en ARM64 Apple Silicon. El simulador no emula la cámara, los sensores, la GPU Metal, Bluetooth LE ni la batería. El código se compila para la arquitectura del host, por lo que las pruebas de rendimiento en el simulador no son representativas.
Use #if targetEnvironment(simulator) en Swift o #if TARGET_OS_SIMULATOR en Objective-C. Estas son directivas de compilación condicional: el código en el bloque se ejecuta solo en el simulador. Es útil para objetos simulados de cámara y registros de depuración no disponibles en un dispositivo real.
Sí, a partir de Xcode 11.4, el simulador admite la simulación de notificaciones push a través de un archivo .apns con estructura JSON. Arrastre el archivo al simulador en ejecución o use el comando xcrun simctl push. Las notificaciones se muestran completamente como en un dispositivo real.
El simulador no admite cámara, micrófono, acelerómetro, giroscopio, TrueDepth, Touch ID (excepto simulación), Face ID (excepto simulación), Bluetooth LE ni NFC. El rendimiento de Metal se simula en la GPU del Mac, lo que no refleja el rendimiento real del iPhone. El consumo de energía no se puede medir.
Cree un simulador mediante xcrun simctl create, luego ejecute xcodebuild test con el parámetro -destination especificando platform=iOS Simulator y el nombre del dispositivo. Para pruebas en paralelo, cree varios simuladores con diferentes versiones de iOS en la configuración de CI.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también