Xcode Simulator é uma ferramenta integrada da Apple que executa aplicativos iOS em um Mac sem um dispositivo físico. O simulador compila o código para a arquitetura x86_64 do host, proporcionando alta velocidade de teste. Documentação da Apple descreve o ciclo completo de depuração usando o simulador para iPhone, iPad, Apple Watch e Apple TV.
Principais pontos
Xcode Simulator é uma ferramenta para executar e depurar aplicações iOS diretamente no Mac. Ao contrário do emulador Android, o simulador da Apple não emula o processador ARM do dispositivo. Em vez disso, o código é compilado para código de máquina da arquitetura do host (x86_64 no Intel Mac ou arm64 no Apple Silicon).
O simulador usa as frameworks iOS diretamente do SDK, fornecendo acesso a UIKit, SwiftUI, Foundation e Core Data. De acordo com a Apple (WWDC 2024), mais de 90% dos desenvolvedores usam o simulador durante a fase de desenvolvimento, conectando dispositivos físicos apenas para testes finais.
Cada versão do Xcode inclui um conjunto de simuladores para diferentes modelos de dispositivos e versões iOS. Por exemplo, o Xcode 16 contém simuladores para iPhone 16 Pro com iOS 18, iPad Pro M4 com iPadOS 18, Apple Watch Series 10 e Apple TV 4K.
O simulador é instalado juntamente com o Xcode a partir da Mac App Store. Para adicionar versões iOS adicionais, use o menu Settings → Platforms. Selecione um simulador no esquema de compilação (Scheme) e pressione Run. Alternativamente, execute o simulador através do menu Xcode → Open Developer Tool → Simulator.
// Verificar versão mínima do iOS para o simulador
if #available(iOS 18.0, *) {
print("APIs iOS 18 disponíveis")
}Compreender as diferenças entre o simulador e um dispositivo real é criticamente importante para testes de qualidade. As principais diferenças residem na arquitetura do processador, capacidades de hardware e desempenho gráfico.
| Característica | Simulador | Dispositivo real |
|---|---|---|
| Arquitetura CPU | x86_64 / arm64 (Mac) | ARM64 (Apple Silicon) |
| GPU Metal | Simulação através da GPU do Mac | GPU Apple nativa |
| Câmara | Indisponível | Completa |
| Acelerómetro/Giroscópio | Indisponível | Sensores de hardware |
| Touch ID / Face ID | Simulação através do menu | Biometria de hardware |
| Notificações push | Desde o Xcode 11.4 (ficheiro .apns) | Servidor APNs |
| Bluetooth LE | Não suportado | Stack completo |
O desempenho no simulador é geralmente superior ao de um dispositivo real, pois utiliza o processador potente do Mac. Isto cria uma falsa impressão de velocidade. As animações, operações Core Data e pedidos de rede num dispositivo real podem funcionar mais lentamente.
Certifique-se de executar a aplicação num dispositivo real antes do lançamento. Cenários críticos: câmara e AVFoundation, Bluetooth e CoreBluetooth, notificações push através de APNs, operações do sistema de ficheiros em App Sandbox, desempenho gráfico em Metal e consumo de energia da bateria.
Para compilação condicional de código para o simulador, a Apple fornece TARGET_OS_SIMULATOR em Objective-C e targetEnvironment(simulator) em Swift. Esta verificação permite adicionar registos de depuração, objetos simulados ou desativar código dependente de hardware.
import UIKit
class CameraViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
#if targetEnvironment(simulator)
showMockCameraPreview()
print("Simulador: usando câmara simulada")
#else
setupRealCameraSession()
#endif
}
}Em Objective-C, a diretiva #if TARGET_OS_SIMULATOR funciona de forma semelhante. Use-a para desativar código que requer sensores de hardware ou câmara. No momento da compilação para o simulador, este código não entra no ficheiro binário.
#if TARGET_OS_SIMULATOR
NSLog(@"Execução no simulador — câmara indisponível");
self.cameraButton.hidden = YES;
#else
self.cameraButton.hidden = NO;
#endifA verificação TARGET_OS_SIMULATOR é utilizada em três casos: substituir a câmara por um objeto simulado durante testes de UI, desativar Core Bluetooth para acelerar o desenvolvimento e registar informações de depuração que não devem chegar à versão de lançamento. Evite usar a verificação para alterar a lógica de negócio — isto pode causar erros num dispositivo real.
Xcode Simulator suporta o conjunto completo de testes XCTest: testes unitários (XCTestCase), testes de UI (XCUITestCase) e testes de desempenho. Testar no simulador não requer um certificado de programador assinado, o que simplifica a configuração 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 executar testes a partir da linha de comandos, use xcodebuild test com o esquema e simulador especificados. O parâmetro -destination define o simulador específico no qual os testes serão executados.
# Executar testes unitários no simulador iPhone 16, iOS 18
xcodebuild test \
-scheme "MyApp" \
-destination "platform=iOS Simulator,name=iPhone 16,OS=18.0" \
-testPlan "AllTests"Apesar da sua conveniência, o Xcode Simulator tem várias limitações que podem levar a erros num dispositivo real. A mais crítica é a falta de emulação ARM: o código é compilado para a arquitetura do host e o comportamento de algumas operações pode diferir.
Core Data e sistema de ficheiros funcionam mais rapidamente no simulador devido ao SSD do Mac. Num dispositivo real com memória NAND, a velocidade de leitura/escrita é menor. Teste o desempenho do Core Data num dispositivo antes do lançamento, especialmente para grandes conjuntos de dados.
Verificar o consumo de energia no simulador é impossível — o simulador é alimentado pelo Mac. Os modos em segundo plano, incluindo carregamento de conteúdo e operações fetch, comportam-se de forma diferente num dispositivo real devido às limitações da bateria e ao Background Task Scheduler.
O simulador não tem acesso aos sensores de hardware do iPhone. Face ID e Touch ID podem ser simulados através do menu do simulador: Features → Face ID → Matching Face. Acelerómetro, giroscópio e barómetro não estão disponíveis — o código que depende de CMDeviceMotion precisa ser testado num dispositivo. Para Core Location, pode definir coordenadas através de Debug → Simulate Location selecionando um ficheiro GPX.
A verificação de iCloud e StoreKit no simulador também é limitada. O StoreKit Test permite simular compras sem um App Store Connect real, mas a verificação do ambiente Sandbox e das compras de produção requer um dispositivo físico. A sincronização do iCloud Drive e CloudKit no simulador funciona incorretamente — a Apple recomenda testar estes cenários apenas em dispositivos reais.
Em Macs com processadores da série M, o simulador funciona de forma fundamentalmente diferente: o código é compilado em ARM64 nativo, como num iPhone real, em vez de x86_64. Isto reduz significativamente a lacuna entre o simulador e o dispositivo. As aplicações executadas no simulador Apple Silicon usam as mesmas instruções ARM que num iPhone físico, tornando os testes de desempenho mais representativos. A diferença no desempenho de Metal e Core Animation entre o simulador da série M e um iPhone real é mínima em comparação com o simulador Intel.
Configurar um simulador para CI requer a criação prévia do dispositivo e versão iOS necessários. Em servidores de Integração Contínua, os simuladores não são criados automaticamente — precisam de ser adicionados através de xcrun simctl create antes de executar os testes.
# Criar simulador para CI
xcrun simctl create \
"iPhone 16 CI" \
"com.apple.CoreSimulator.SimDeviceType.iPhone-16" \
"com.apple.CoreSimulator.SimRuntime.iOS-18-0"
# Executar testes no simulador criado
xcodebuild test \
-workspace MyApp.xcworkspace \
-scheme MyApp \
-destination "id=$(xcrun simctl list devices | grep 'iPhone 16 CI' | awk -F'[][]' '{print }')"Para testes paralelos em CI, configure vários simuladores com diferentes versões iOS. O Xcode Cloud, GitHub Actions e Bitrise suportam execução paralela de testes, reduzindo o tempo de execução em 2-3 vezes. Certifique-se de que todos os simuladores iOS necessários para teste estão instalados no servidor CI.
Perguntas frequentes
O simulador funciona na arquitetura x86_64 e usa a CPU do Mac, enquanto um dispositivo real funciona em ARM64 Apple Silicon. O simulador não emula a câmara, sensores, GPU Metal, Bluetooth LE ou bateria. O código é compilado para a arquitetura do host, pelo que os testes de desempenho no simulador não são representativos.
Use #if targetEnvironment(simulator) em Swift ou #if TARGET_OS_SIMULATOR em Objective-C. Estas são diretivas de compilação condicional: o código no bloco executa apenas no simulador. Útil para objetos simulados de câmara e registos de depuração indisponíveis num dispositivo real.
Sim, a partir do Xcode 11.4, o simulador suporta simulação de notificações push através de um ficheiro .apns com estrutura JSON. Arraste o ficheiro para o simulador em execução ou use o comando xcrun simctl push. As notificações aparecem completamente como num dispositivo real.
O simulador não suporta câmara, microfone, acelerómetro, giroscópio, TrueDepth, Touch ID (exceto simulação), Face ID (exceto simulação), Bluetooth LE e NFC. O desempenho Metal é simulado na GPU do Mac, o que não reflete o desempenho real do iPhone. O consumo de energia não pode ser medido.
Crie um simulador através de xcrun simctl create, depois execute xcodebuild test com o parâmetro -destination especificando platform=iOS Simulator e o nome do dispositivo. Para testes paralelos, crie vários simuladores com diferentes versões iOS na configuração CI.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também