Was macht iOS E2E?
Arbeiten Sie vom Checkout-Root aus. Eine lokale .mobilebuildmcp/config.yaml (Setup) liefert Projekt, Scheme und DerivedData, sodass mobilebuildmcp-Befehle keine Projekt-Flags benötigen.
Zwei Werte tauchen immer wieder auf:
$sim: die Simulator-UDID (pnpm ios:sim:pairgibt eine aus). Übergeben Sie--simulator-id "$sim"bei jedemmobilebuildmcp-Aufruf; ohne das Flag verwendet der Konfigurationsstandard den Simulator namensiPhone 17.$bundle: die Bundle-ID, die vom Signing-Team abhängt. Lesen Sie sie aus dem Build:bundle=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' apps/ios/build/DerivedData/Build/Products/Debug-iphonesimulator/OpenClaw.app/Info.plist).
Build und Start
-
Build:
mobilebuildmcp simulator build. Bearbeiten Sie zuerstapps/ios/project.yml, führen Sie dannpnpm ios:genaus. -
Installieren und starten mit
simctl, das Startargumente akzeptiert (pnpm ios:runakzeptiert keine):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-runundlaunch-apphängen eine Log-Erfassung an, die nie beendet wird. -
Debug-Startargumente:
grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u.--openclaw-screenshot-modeplus ein--openclaw-*-fixture-Flag zeigt einen Fixture-Bildschirm ohne Gateway;-AppleLanguages "(de)" -AppleLocale de_DEführt eine andere Sprache aus. Das Debug-URL-Schema istopenclaw-debug://.
Steuerung der Benutzeroberfläche
mobilebuildmcp ui-automation snapshot-ui --style minimallistet antippbare Ziele auf alsref|action|role|label|value|id. Text, der kein Steuerelement ist (Chat-Bläschen, Zeilentitel), erscheint nur mit--output json.- Aktion auf einer Referenz mit
tap,type-text,long-press(--durationin Millisekunden),swipeodergesture. Warten mitwait-for-ui:--predicate exists --label '…' --role buttonfür ein Element,--predicate textContains --text '…'für Text. Ein Wait-Selektor, der mehrere Elemente matcht, schlägt fehl; fügen Sie--roleoder--identifierhinzu. Halten Sie--timeout-msunter 30000: der Daemon beendet jede Anfrage nach 30 s mitDAEMON_TRANSPORT_FAILED; wiederholen Sie den Wait für längere Zeiten. - Referenzen gehören zu einem Snapshot; machen Sie nach jeder Bildschirmänderung einen neuen.
- Bildschirm anzeigen:
mobilebuildmcp simulator screenshot, dann lesen Sie das ausgegebene JPEG.
Probleme:
- Onboarding und Sheets listen auch die Bildschirme dahinter auf; matchen Sie nach Label oder ID und nehmen Sie den letzten Treffer.
- Auf dem iPhone überlagert die Seitenleiste den Inhalt: tippen Sie
RootTabs.Sidebar.Showvor den Zeilen. xcrun simctl openurlreiht pro Aufruf eine System-"In OpenClaw öffnen?"-Warnung ein; tippen Sie für jedeÖffnenoderAbbrechen.- System-UI außerhalb des App-Prozesses (Fotoauswahl, Teilen-Blatt) fehlt in Snapshots. Tippen Sie per Koordinaten mit dem in MobileBuildMCP gebündelten AXe-Binary:
"$(brew --prefix mobilebuildmcp)/libexec/bundled/axe" tap -x <x> -y <y> --udid "$sim". Koordinaten sind Punkte: Screenshot-Pixel × Bildschirmbreite in Punkten ÷ Screenshot-Breite.
Logs und Abstürze
Zuerst Aktion ausführen, dann ein begrenztes Zeitfenster lesen:
xcrun simctl spawn "$sim" log show --last 2m --style compact --predicate 'subsystem BEGINSWITH "ai.openclaw"'
Abstürze landen in ~/Library/Logs/DiagnosticReports/OpenClaw-*.ips; der erste OpenClaw-Frame des triggered-Threads benennt den Übeltäter. App-Präferenzen und Datenbanken leben im App-Container (xcrun simctl get_app_container "$sim" "$bundle" data); simctl spawn … defaults read kann sie nicht sehen. LLDB und xctrace: DEBUG.md.
Tests
- Führen Sie die betroffenen Suites aus:
pnpm ios:test <Suite>(Selektoren undIOS_SIM:apps/ios/README.md). - Zeigen Sie, dass ein Regressionstest auf dem Basisstand rot ist: committen Sie die Änderung, checken Sie die Basisversion der geänderten Quelldateien aus (
git checkout <base> -- <paths>), führen Sie die Suite aus, danngit checkout HEAD -- <paths>.
Erledigt: die betroffenen Suites bestehen, und jeder neue Regressionstest schlägt auf dem Basisstand fehl.
End-to-End-Nachweis einer Änderung
- Starten Sie das isolierte Gateway (einmaliges Profil in Setup) als langlebigen Dienst:
node scripts/run-node.mjs --profile ios-sim gateway --bind loopback. Es berührt nie das Gateway des Betreibers oder~/.openclaw. Während es läuft, rufen Sie die CLI auf alsnode openclaw.mjs --profile ios-sim …;run-nodeverweigert den Neubau unter einem laufenden Gateway. - Koppeln Sie einen frischen Simulator über die echte Onboarding-Oberfläche:
sim=$(pnpm --silent ios:sim:pair | tail -1)(--appfür einen anderen Build,--profilefür ein anderes Profil). - Testen Sie die Änderung durch sichtbare Steuerelemente. Ein Chat-Hin-und-Her: geben Sie in
chat-message-inputein, tippen Siechat-send-message, warten Sie dann auf ein Wort, das nur die Antwort enthält. - Builds vergleichen: dieselben Schritte auf
mainund auf der Änderung, jeweils auf einem eigenen frischen Simulator, mit passenden Screenshots. - Stoppen Sie das Gateway und löschen Sie die Simulatoren.
Node-Befehle, Berechtigungen, Authentifizierungsfehler, Ausfälle, abgelehnte Sends, Upgrades und iPad-Layout: PROOF.md, das auch auflistet, was nur ein Gerät beweist.
Erledigt: Screenshots oder aufgezeichnetes Output zeigen das Verhalten auf der Änderung und dessen Fehlen auf main; der Gateway-Port ist geschlossen und es bleibt kein openclaw-pair-*-Simulator übrig.
Setup
Einmalig pro Maschine; jeder Schritt endet mit einem Check.
-
Xcode, Simulator-Laufzeiten,
xcodegenund die Watch Rust-Toolchain: Voraussetzungen ausapps/ios/README.md. Check:xcrun simctl list devices availablezeigtiPhone 17. -
SwiftFormat und SwiftLint im Repo-Pin:
scripts/install-swift-tools.sh <dir on PATH>. Check:scripts/check-swift-tools.shbeendet mit 0. -
MobileBuildMCP, Sentrys XcodeBuildMCP CLI:
brew tap getsentry/xcodebuildmcp && brew install getsentry/xcodebuildmcp/mobilebuildmcp. Diese Schritte wurden gegen Version 2.7.1 erstellt. Check:mobilebuildmcp --version. -
Checkout:
pnpm install --frozen-lockfile, dannpnpm ios:gen(das Xcode-Projekt wird generiert, nicht eingecheckt). Erstellen Sie dann.mobilebuildmcp/config.yamlund fügen Sie/.mobilebuildmcp/zu.git/info/excludehinzu: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 # geteilt mit pnpm ios:runCheck:
mobilebuildmcp simulator list-schemeslistetOpenClaw, undmobilebuildmcp simulator buildist erfolgreich. -
Das
ios-sim-Gateway-Profil, mit gestopptem Gateway (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)". Chat-Antworten benötigen ein Modell für seinenmain-Agenten:oc models auth loginoderaddmit Test-Anmeldedaten. Check: das Gateway startet, undpnpm ios:sim:pairendet auf dem Chat-Bildschirm.