O que iOS E2E faz?
Trabalhe a partir da raiz do checkout. Um arquivo local .mobilebuildmcp/config.yaml (Setup) fornece o projeto, scheme e DerivedData, portanto comandos mobilebuildmcp não precisam de flags de projeto.
Dois valores são recorrentes:
$sim: o UDID do simulador (pnpm ios:sim:pairexibe um). Passe--simulator-id "$sim"para cada chamadamobilebuildmcp; sem ele, o padrão da config mira o simulador chamadoiPhone 17.$bundle: o bundle ID, que depende do time de signing. Leia-o do build:bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).
Construir e executar
-
Construir:
mobilebuildmcp simulator build. Após editarapps/ios/project.yml, executepnpm ios:genprimeiro. -
Instalar e iniciar com
simctl, que aceita argumentos de inicialização (pnpm ios:runnão aceita nenhum):xcrun simctl install "$sim" apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app xcrun simctl launch --terminate-running-process "$sim" "$bundle" --openclaw-reset-onboardingmobilebuildmcp simulator build-and-runelaunch-appanexam uma captura de log que nunca termina. -
Depurar argumentos de inicialização:
grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u.--openclaw-screenshot-modejunto com uma flag--openclaw-*-fixturemostra uma tela de fixture sem um Gateway;-AppleLanguages "(de)" -AppleLocale de_DEexecuta em outro idioma. O esquema de URL de depuração éopenclaw-debug://.
Acionar a interface do usuário
mobilebuildmcp ui-automation snapshot-ui --style minimallista alvos tocáveis comoref|action|role|label|value|id. Texto que não é um controle (bolhas de chat, títulos de linha) aparece apenas com--output json.- Aja em um ref com
tap,type-text,long-press(--durationem milissegundos),swipeougesture. Aguarde comwait-for-ui:--predicate exists --label '…' --role buttonpara um elemento,--predicate textContains --text '…'para texto. Um seletor de espera que corresponde a vários elementos falha; adicione--roleou--identifier. Mantenha--timeout-msabaixo de 30000: o daemon encerra qualquer requisição após 30 s comDAEMON_TRANSPORT_FAILED; repita a espera para durações maiores. - Refs pertencem a um snapshot; tire um novo após cada mudança de tela.
- Veja a tela:
mobilebuildmcp simulator screenshot, depois leia o JPEG impresso.
Pegadinhas:
- Onboarding e sheets também listam as telas atrás deles; combine pelo label ou id e pegue a última correspondência.
- No iPhone, a sidebar sobrepõe o conteúdo: toque em
RootTabs.Sidebar.Showantes de suas linhas. xcrun simctl openurlenfileira um alerta do sistema "Abrir no OpenClaw?" por chamada; toque emOpenouCancelpara cada um.- A interface do sistema fora do processo do aplicativo (seletor de fotos, share sheet) está ausente dos snapshots. Toque nela por coordenadas com o binário AXe empacotado no MobileBuildMCP:
"$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Coordenadas são pontos: pixels da screenshot x largura da tela em pontos ÷ largura da screenshot.
Logs e crashes
Aja primeiro, depois leia uma janela limitada:
xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'
Crashes vão para ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips; o primeiro frame OpenClaw da thread triggered nomeia o culpado. Preferências do app e bancos de dados ficam no contêiner do aplicativo (xcrun simctl get_app_container "$sim" "$bundle" data); simctl spawn … defaults read não consegue vê-los. LLDB e xctrace: DEBUG.md.
Testes
- Execute os suites tocados:
pnpm ios:test <Suite>(seletores eIOS_SIM:apps/ios/README.md). - Prove que um teste de regressão fica vermelho na base: faça commit da alteração, checkout da versão base dos arquivos fonte alterados (
git checkout <base> -- <paths>), execute o suite, depoisgit checkout HEAD -- <paths>.
Feito: os suites tocados passam, e cada novo teste de regressão falha na base.
Provar uma alteração de ponta a ponta
- Inicie o Gateway isolado (perfil único em Setup) como um serviço de longa duração:
node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Ele nunca toca o Gateway do operador ou~/.openclaw. Enquanto ele estiver em execução, chame a CLI comonode openclaw.mjs --profile ios-sim …;run-nodese recusa a reconstruir sob um Gateway em execução. - Emparelhe um simulador novo através da interface de onboarding real:
sim=$(pnpm --silent ios:sim:pair | tail -1)(--apppara outro build,--profilepara outro perfil). - Exercite a alteração através de controles visíveis. Um round trip de chat: digite em
chat-message-input, toque emchat-send-message, depois aguarde uma palavra que apenas a resposta contém. - Compare builds: os mesmos passos em
maine na alteração, cada um em seu próprio simulador novo, com screenshots correspondentes. - Pare o Gateway e delete os simuladores.
Comandos Node, permissões, falhas de autenticação, indisponibilidades, envios rejeitados, upgrades e layout do iPad: PROOF.md, que também lista o que apenas um dispositivo prova.
Feito: screenshots ou saída gravada mostram o comportamento na alteração e sua ausência em main; a porta do Gateway está fechada e nenhum simulador openclaw-pair-* permanece.
Setup
Uma vez por máquina; cada passo termina com uma verificação.
-
Xcode, runtimes de simulador,
xcodegene a toolchain Rust para Watch: pré-requisitos deapps/ios/README.md. Verifique:xcrun simctl list devices availablemostraiPhone 17. -
SwiftFormat e SwiftLint no pin do repositório:
scripts/install-swift-tools.sh <dir on PATH>. Verifique:scripts/check-swift-tools.shsai com 0. -
MobileBuildMCP, CLI Sentry's XcodeBuildMCP:
brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Estes passos foram escritos contra a versão 2.7.1. Verifique:mobilebuildmcp --version. -
Checkout:
pnpm install --frozen-lockfile, depoispnpm ios:gen(o projeto Xcode é gerado, não versionado). Em seguida, crie.mobilebuildmcp/config.yamle adicione/.mobilebuildmcp/ao.git/info/exclude:schemaVersion: 1 enabledWorkflows: [simulator, simulator-management, ui-automation, debugging] sentryDisabled: true sessionDefaults: projectPath: ./apps/ios/OpenClaw.xcodeproj scheme: OpenClaw configuration: Debug platform: iOS simulatorName: iPhone 17 derivedDataPath: ./apps/ios/build/DerivedData # compartilhado com pnpm ios:runVerifique:
mobilebuildmcp simulator list-schemeslistaOpenClaw, emobilebuildmcp simulator buildé bem-sucedido. -
O perfil de Gateway
ios-sim, com o Gateway parado (oc=node openclaw.mjs --profile ios-sim):oc config set gateway.mode local,oc config set gateway.port 19031,oc config set gateway.auth.mode token,oc config set gateway.auth.token "$(openssl rand -hex 24)". Respostas de chat precisam de um modelo para seu agentemain:oc models auth loginouaddcom credenciais de teste. Verifique: o Gateway inicia, epnpm ios:sim:pairtermina na tela de chat.