CommunityCodierung & Entwicklunggithub.com

iOS E2E

iOS-App im Simulator – Build, Start, Kopplung mit isoliertem Gateway, UI-Steuerung, Screenshots, Logs und Abstürze, gezielte Tests und End-to-End-Nachweis.

Was ist iOS E2E?

Dieses Skill ermöglicht es, eine iOS-App vollständig auf dem Simulator zu builden, zu starten und end-to-end zu testen. Es nutzt `mobilebuildmcp` für Builds und UI-Automatisierung sowie `simctl` für die Installation und das Starten der App. Der Skill umfasst die Erstellung eines isolierten Gateway-Profils, das Koppeln eines frischen Simulators über die echte Onboarding-Oberfläche und die Durchführung von UI-Interaktionen wie Tippen, Texteingabe und Wischen. Reproduzierbare Tests und Regressionstests werden durch den Vergleich von Builds auf `main` und dem Änderungszweig unterstützt, wobei Screenshots und Logs das Verhalten dokumentieren. Voraussetzung ist ein einmalig pro Maschine eingerichtetes Setup mit Xcode, Simulator-Runtimes, `mobilebuildmcp` und einem Gateway-Profil. Das Skill ist für die Verwendung mit Claude Code, Cursor, Codex und anderen KI-Agenten optimiert, die auf der Kommandozeile arbeiten.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/ios-e2e

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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:pair gibt eine aus). Übergeben Sie --simulator-id "$sim" bei jedem mobilebuildmcp-Aufruf; ohne das Flag verwendet der Konfigurationsstandard den Simulator namens iPhone 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

  1. Build: mobilebuildmcp simulator build. Bearbeiten Sie zuerst apps/ios/project.yml, führen Sie dann pnpm ios:gen aus.

  2. Installieren und starten mit simctl, das Startargumente akzeptiert (pnpm ios:run akzeptiert 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-onboarding
    

    mobilebuildmcp simulator build-and-run und launch-app hängen eine Log-Erfassung an, die nie beendet wird.

  3. Debug-Startargumente: grep -rhoE '"--openclaw-[a-z-]+"' apps/ios/Sources | sort -u. --openclaw-screenshot-mode plus ein --openclaw-*-fixture-Flag zeigt einen Fixture-Bildschirm ohne Gateway; -AppleLanguages "(de)" -AppleLocale de_DE führt eine andere Sprache aus. Das Debug-URL-Schema ist openclaw-debug://.

Steuerung der Benutzeroberfläche

  1. mobilebuildmcp ui-automation snapshot-ui --style minimal listet antippbare Ziele auf als ref|action|role|label|value|id. Text, der kein Steuerelement ist (Chat-Bläschen, Zeilentitel), erscheint nur mit --output json.
  2. Aktion auf einer Referenz mit tap, type-text, long-press (--duration in Millisekunden), swipe oder gesture. Warten mit wait-for-ui: --predicate exists --label '…' --role button für ein Element, --predicate textContains --text '…' für Text. Ein Wait-Selektor, der mehrere Elemente matcht, schlägt fehl; fügen Sie --role oder --identifier hinzu. Halten Sie --timeout-ms unter 30000: der Daemon beendet jede Anfrage nach 30 s mit DAEMON_TRANSPORT_FAILED; wiederholen Sie den Wait für längere Zeiten.
  3. Referenzen gehören zu einem Snapshot; machen Sie nach jeder Bildschirmänderung einen neuen.
  4. 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.Show vor den Zeilen.
  • xcrun simctl openurl reiht pro Aufruf eine System-"In OpenClaw öffnen?"-Warnung ein; tippen Sie für jede Öffnen oder Abbrechen.
  • 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

  1. Führen Sie die betroffenen Suites aus: pnpm ios:test <Suite> (Selektoren und IOS_SIM: apps/ios/README.md).
  2. 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, dann git checkout HEAD -- <paths>.

Erledigt: die betroffenen Suites bestehen, und jeder neue Regressionstest schlägt auf dem Basisstand fehl.

End-to-End-Nachweis einer Änderung

  1. 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 als node openclaw.mjs --profile ios-sim …; run-node verweigert den Neubau unter einem laufenden Gateway.
  2. Koppeln Sie einen frischen Simulator über die echte Onboarding-Oberfläche: sim=$(pnpm --silent ios:sim:pair | tail -1) (--app für einen anderen Build, --profile für ein anderes Profil).
  3. Testen Sie die Änderung durch sichtbare Steuerelemente. Ein Chat-Hin-und-Her: geben Sie in chat-message-input ein, tippen Sie chat-send-message, warten Sie dann auf ein Wort, das nur die Antwort enthält.
  4. Builds vergleichen: dieselben Schritte auf main und auf der Änderung, jeweils auf einem eigenen frischen Simulator, mit passenden Screenshots.
  5. 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.

  1. Xcode, Simulator-Laufzeiten, xcodegen und die Watch Rust-Toolchain: Voraussetzungen aus apps/ios/README.md. Check: xcrun simctl list devices available zeigt iPhone 17.

  2. SwiftFormat und SwiftLint im Repo-Pin: scripts/install-swift-tools.sh <dir on PATH>. Check: scripts/check-swift-tools.sh beendet mit 0.

  3. 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.

  4. Checkout: pnpm install --frozen-lockfile, dann pnpm ios:gen (das Xcode-Projekt wird generiert, nicht eingecheckt). Erstellen Sie dann .mobilebuildmcp/config.yaml und fügen Sie /.mobilebuildmcp/ zu .git/info/exclude hinzu:

    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:run
    

    Check: mobilebuildmcp simulator list-schemes listet OpenClaw, und mobilebuildmcp simulator build ist erfolgreich.

  5. 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 seinen main-Agenten: oc models auth login oder add mit Test-Anmeldedaten. Check: das Gateway startet, und pnpm ios:sim:pair endet auf dem Chat-Bildschirm.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills and agent Templates when requested; add Templates; install, verify, update, uninstall, publish, or sync skills.

Verwandte Skills