iOS Simulator: cos'è e come funziona in Xcode

Autore: IT Sectr Pubblicato: 2026-02-09 Tempo di lettura: 8 min

Xcode Simulator è uno strumento integrato di Apple che esegue applicazioni iOS su un Mac senza un dispositivo fisico. Il simulatore compila il codice per l'architettura x86_64 dell'host, garantendo un'elevata velocità di test. Documentazione Apple descrive il ciclo completo di debug utilizzando il simulatore per iPhone, iPad, Apple Watch e Apple TV.

Punti chiave

  • Xcode Simulator — emulazione di un dispositivo iOS a livello applicativo senza emulazione completa dell'architettura ARM
  • Differenza dal dispositivo reale — il simulatore non supporta fotocamera, GPU Metal, sensori e notifiche push (prima di Xcode 11.4)
  • TARGET_OS_SIMULATOR — direttiva per verificare l'ambiente di esecuzione nel codice Objective-C e Swift
  • Test unitari e test UI — il simulatore supporta la suite completa XCTest con possibilità di esecuzione su server CI
  • Piattaforme multiple — il simulatore supporta iPhone, iPad, Apple Watch, Apple TV e Vision Pro

Cos'è Simulator in Xcode?

Xcode Simulator è uno strumento per eseguire e debuggare applicazioni iOS direttamente su un Mac. A differenza dell'emulatore Android, il simulatore Apple non emula il processore ARM del dispositivo. Invece, il codice viene compilato in codice macchina dell'architettura dell'host (x86_64 su Intel Mac o arm64 su Apple Silicon).

Il simulatore utilizza i framework iOS direttamente dall'SDK, fornendo accesso a UIKit, SwiftUI, Foundation e Core Data. Secondo Apple (WWDC 2024), oltre il 90% degli sviluppatori utilizza il simulatore nella fase di sviluppo, collegando dispositivi fisici solo per i test finali.

Ogni versione di Xcode include una serie di simulatori per diversi modelli di dispositivi e versioni iOS. Ad esempio, Xcode 16 contiene simulatori per iPhone 16 Pro con iOS 18, iPad Pro M4 con iPadOS 18, Apple Watch Series 10 e Apple TV 4K.

Installazione e avvio del simulatore

Il simulatore viene installato insieme a Xcode dal Mac App Store. Per aggiungere versioni iOS aggiuntive, utilizzare il menu Settings → Platforms. Selezionare un simulatore nello schema di build (Scheme) e premere Run. In alternativa, avviare il simulatore tramite il menu Xcode → Open Developer Tool → Simulator.

swift
// Verifica della versione minima iOS per il simulatore
if #available(iOS 18.0, *) {
    print("API iOS 18 disponibili")
}

Differenze tra simulatore e dispositivo reale

Comprendere le differenze tra simulatore e dispositivo reale è di fondamentale importanza per test di qualità. Le differenze principali risiedono nell'architettura del processore, nelle capacità hardware e nelle prestazioni grafiche.

CaratteristicaSimulatoreDispositivo reale
Architettura CPUx86_64 / arm64 (Mac)ARM64 (Apple Silicon)
GPU MetalSimulazione tramite GPU MacGPU Apple nativa
FotocameraNon disponibileCompleta
Accelerometro/GiroscopioNon disponibileSensori hardware
Touch ID / Face IDSimulazione tramite menuBiometria hardware
Notifiche pushDa Xcode 11.4 (file .apns)Server APNs
Bluetooth LENon supportatoStack completo

Le prestazioni nel simulatore sono generalmente superiori a quelle di un dispositivo reale, poiché utilizza il potente processore del Mac. Questo crea una falsa impressione di velocità. Animazioni, operazioni Core Data e richieste di rete su un dispositivo reale potrebbero funzionare più lentamente.

Quando è obbligatorio testare su un dispositivo

Assicurati di eseguire l'applicazione su un dispositivo reale prima del rilascio. Scenari critici: fotocamera e AVFoundation, Bluetooth e CoreBluetooth, notifiche push tramite APNs, operazioni del file system in App Sandbox, prestazioni grafiche in Metal e consumo energetico della batteria.

Verifica di TARGET_OS_SIMULATOR nel codice

Per la compilazione condizionale del codice per il simulatore, Apple fornisce TARGET_OS_SIMULATOR in Objective-C e targetEnvironment(simulator) in Swift. Questa verifica consente di aggiungere log di debug, oggetti mock o disabilitare codice dipendente dall'hardware.

swift
import UIKit

class CameraViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        #if targetEnvironment(simulator)
        showMockCameraPreview()
        print("Simulatore: utilizzo fotocamera mock")
        #else
        setupRealCameraSession()
        #endif
    }
}

In Objective-C, la direttiva #if TARGET_OS_SIMULATOR funziona in modo simile. Usala per disabilitare il codice che richiede sensori hardware o fotocamera. Al momento della compilazione per il simulatore, questo codice non entra nel file binario.

objective-c
#if TARGET_OS_SIMULATOR
NSLog(@"Esecuzione nel simulatore — fotocamera non disponibile");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endif

Casi d'uso tipici della verifica

La verifica TARGET_OS_SIMULATOR viene utilizzata in tre casi: sostituire la fotocamera con un oggetto mock durante i test UI, disabilitare Core Bluetooth per accelerare lo sviluppo e registrare informazioni di debug che non dovrebbero finire nella build di rilascio. Evita di utilizzare la verifica per modificare la logica di business — ciò potrebbe causare bug su un dispositivo reale.

Esecuzione di test nel simulatore

Xcode Simulator supporta la suite completa di test XCTest: test unitari (XCTestCase), test UI (XCUITestCase) e test delle prestazioni. Testare sul simulatore non richiede un certificato sviluppatore firmato, semplificando la configurazione CI/CD.

swift
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)
    }
}

Per eseguire test dalla riga di comando, utilizzare xcodebuild test specificando lo schema e il simulatore. Il parametro -destination definisce il simulatore specifico su cui verranno eseguiti i test.

bash
# Esecuzione test unitari su simulatore iPhone 16, iOS 18
xcodebuild test \
  -scheme "MyApp" \
  -destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
  -testPlan "AllTests"

Limitazioni e insidie

Nonostante la sua praticità, Xcode Simulator presenta una serie di limitazioni che possono portare a bug su un dispositivo reale. La più critica è l'assenza di emulazione ARM: il codice viene compilato per l'architettura dell'host e il comportamento di alcune operazioni potrebbe differire.

Core Data e il file system funzionano più velocemente sul simulatore grazie all'SSD del Mac. Su un dispositivo reale con memoria NAND, la velocità di lettura/scrittura è inferiore. Testa le prestazioni di Core Data su un dispositivo prima del rilascio, specialmente per set di dati di grandi dimensioni.

La verifica del consumo energetico sul simulatore è impossibile — il simulatore è alimentato dal Mac. Le modalità in background, inclusi il caricamento di contenuti e le operazioni di fetch, si comportano diversamente su un dispositivo reale a causa delle limitazioni della batteria e del Background Task Scheduler.

Sensori hardware e biometria

Il simulatore non ha accesso ai sensori hardware dell'iPhone. Face ID e Touch ID possono essere simulati tramite il menu del simulatore: Features → Face ID → Matching Face. Accelerometro, giroscopio e barometro non sono disponibili — il codice che si basa su CMDeviceMotion deve essere testato su un dispositivo. Per Core Location, puoi impostare le coordinate tramite Debug → Simulate Location selezionando un file GPX.

La verifica di iCloud e StoreKit sul simulatore è anch'essa limitata. StoreKit Test consente di simulare acquisti senza un vero App Store Connect, ma la verifica dell'ambiente Sandbox e degli acquisti in produzione richiede un dispositivo fisico. La sincronizzazione di iCloud Drive e CloudKit sul simulatore funziona in modo errato — Apple consiglia di testare questi scenari solo su dispositivi reali.

Simulatore su Apple Silicon Mac

Sui Mac con processori della serie M, il simulatore funziona in modo fondamentalmente diverso: il codice viene compilato in ARM64 nativo, come su un vero iPhone, anziché in x86_64. Questo riduce significativamente il divario tra simulatore e dispositivo. Le applicazioni eseguite sul simulatore Apple Silicon utilizzano le stesse istruzioni ARM di un iPhone fisico, rendendo i test delle prestazioni più rappresentativi. La differenza nelle prestazioni di Metal e Core Animation tra il simulatore della serie M e un vero iPhone è minima rispetto al simulatore Intel.

Configurazione del simulatore per CI

La configurazione di un simulatore per CI richiede la creazione preventiva del dispositivo e della versione iOS necessari. Sui server di integrazione continua, i simulatori non vengono creati automaticamente — devono essere aggiunti tramite xcrun simctl create prima di eseguire i test.

bash
# Creare simulatore per CI
xcrun simctl create \
  "iPhone 16 CI" \
  "com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
  "com.apple.CoreSimulator.SimRuntime.iOS-18-0"

# Eseguire test sul simulatore creato
xcodebuild test \
  -workspace MyApp.xcworkspace \
  -scheme MyApp \
  -destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"

Per i test paralleli su CI, configurare più simulatori con diverse versioni iOS. Xcode Cloud, GitHub Actions e Bitrise supportano l'esecuzione parallela dei test, riducendo i tempi di esecuzione di 2-3 volte. Assicurati che tutti i simulatori iOS necessari per i test siano installati sul server CI.

Domande frequenti

In cosa differisce Xcode Simulator da un dispositivo reale?

Il simulatore funziona sull'architettura x86_64 e utilizza la CPU del Mac, mentre un dispositivo reale funziona su ARM64 Apple Silicon. Il simulatore non emula fotocamera, sensori, GPU Metal, Bluetooth LE e batteria. Il codice viene compilato per l'architettura dell'host, quindi i test delle prestazioni sul simulatore non sono rappresentativi.

Come verificare nel codice se l'app è in esecuzione sul simulatore?

Utilizza #if targetEnvironment(simulator) in Swift o #if TARGET_OS_SIMULATOR in Objective-C. Queste sono direttive di compilazione condizionale: il codice nel blocco viene eseguito solo sul simulatore. Utile per oggetti mock della fotocamera e log di debug non disponibili su un dispositivo reale.

È possibile testare le notifiche push sul simulatore?

Sì, a partire da Xcode 11.4, il simulatore supporta la simulazione di notifiche push tramite un file .apns con struttura JSON. Trascina il file sul simulatore in esecuzione o usa il comando xcrun simctl push. Le notifiche vengono visualizzate completamente come su un dispositivo reale.

Quali sono le limitazioni di Xcode Simulator?

Il simulatore non supporta fotocamera, microfono, accelerometro, giroscopio, TrueDepth, Touch ID (tranne simulazione), Face ID (tranne simulazione), Bluetooth LE e NFC. Le prestazioni Metal sono simulate sulla GPU del Mac, che non riflette le prestazioni reali dell'iPhone. Il consumo energetico non può essere misurato.

Come eseguire test su CI utilizzando il simulatore?

Crea un simulatore tramite xcrun simctl create, quindi esegui xcodebuild test con il parametro -destination specificando platform=iOS Simulator e il nome del dispositivo. Per i test paralleli, crea più simulatori con diverse versioni iOS nella configurazione CI.

Riepilogo

  • Xcode Simulator — strumento per eseguire applicazioni iOS su un Mac, compila codice per l'architettura dell'host senza emulazione ARM
  • Differenze dal dispositivo — il simulatore non supporta fotocamera, GPU Metal, sensori, Bluetooth, NFC e non fornisce prestazioni rappresentative
  • Compilazione condizionale — TARGET_OS_SIMULATOR e targetEnvironment(simulator) consentono di aggiungere oggetti mock e log di debug
  • Test — XCTest supporta test unitari, UI e delle prestazioni sul simulatore senza certificato sviluppatore
  • Configurazione CI — crea simulatori tramite xcrun simctl ed esegui test paralleli su più versioni iOS
  • Scenari critici — fotocamera, Bluetooth, notifiche push e prestazioni Metal richiedono test su un dispositivo reale
  • Apple Silicon Mac — il simulatore sulla serie M esegue applicazioni iOS con differenze architetturali minime

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche