xcode-build

📁 pzep1/xcode-build-skill 📅 Jan 19, 2026
48
总安装量
47
周安装量
#4403
全站排名
安装命令
npx skills add https://github.com/pzep1/xcode-build-skill --skill xcode-build

Agent 安装分布

opencode 40
codex 38
gemini-cli 33
claude-code 31
github-copilot 29
cursor 22

Skill 文档

Xcode Build Direct

Build and manage iOS/macOS projects using native Xcode CLI tools instead of MCP servers.

When to Use This Skill

Use this skill when:

  • Building iOS or macOS apps with Xcode
  • Running apps in iOS simulators
  • Managing simulator instances (boot, shutdown, list)
  • Taking screenshots of simulators
  • Capturing app logs
  • Running tests (unit or UI)
  • Automating UI interactions (tap, type, swipe)

Preference: Always use direct CLI commands (xcodebuild, xcrun simctl) instead of XcodeBuildMCP tools.

Quick Start

1. Discover Project Structure

# List schemes in a workspace
xcodebuild -workspace /path/to/App.xcworkspace -list

# List schemes in a project
xcodebuild -project /path/to/App.xcodeproj -list

# Show build settings
xcodebuild -workspace /path/to/App.xcworkspace -scheme AppScheme -showBuildSettings

2. Find Available Simulators

# List all simulators
xcrun simctl list devices

# List as JSON (better for parsing)
xcrun simctl list devices --json

# List only available simulators
xcrun simctl list devices available

3. Build for Simulator

# Get simulator UUID first
UDID=$(xcrun simctl list devices --json | jq -r '.devices | .[].[] | select(.name=="iPhone 16 Pro") | .udid' | head -1)

# Build
xcodebuild \
  -workspace /path/to/App.xcworkspace \
  -scheme AppScheme \
  -destination "platform=iOS Simulator,id=$UDID" \
  -configuration Debug \
  -derivedDataPath /tmp/build \
  build

4. Install and Launch

# Find the built .app
APP_PATH=$(find /tmp/build -name "*.app" -type d | head -1)

# Install on simulator
xcrun simctl install $UDID "$APP_PATH"

# Launch app
xcrun simctl launch $UDID com.your.bundleid

5. Take Screenshot

xcrun simctl io $UDID screenshot /tmp/screenshot.png

Detailed References

For comprehensive command documentation, see:

  • CLI_REFERENCE.md – Full xcodebuild and xcrun simctl command reference
  • XCUITEST_GUIDE.md – UI automation via XCUITest (tap, type, gestures, element queries)

Common Patterns

Build + Run Workflow

# 1. Boot simulator
xcrun simctl boot $UDID 2>/dev/null || true

# 2. Build
xcodebuild -workspace App.xcworkspace -scheme App \
  -destination "platform=iOS Simulator,id=$UDID" \
  -derivedDataPath /tmp/build build

# 3. Find and install app
APP=$(find /tmp/build -name "*.app" -type d | head -1)
xcrun simctl install $UDID "$APP"

# 4. Launch with console output
xcrun simctl launch --console $UDID com.bundle.id

Log Capture

# Stream app logs (run in background)
/usr/bin/log stream \
  --predicate 'processImagePath CONTAINS[cd] "AppName"' \
  --style json &
LOG_PID=$!

# ... interact with app ...

# Stop logging
kill $LOG_PID

Running Tests

# Unit tests
xcodebuild -workspace App.xcworkspace -scheme App \
  -destination "platform=iOS Simulator,id=$UDID" \
  test

# Specific test class
xcodebuild -workspace App.xcworkspace -scheme App \
  -destination "platform=iOS Simulator,id=$UDID" \
  -only-testing "AppTests/MyTestClass" \
  test

UI Automation

For tapping, typing, and UI element queries, use XCUITest (Apple’s native UI testing framework).

This is more powerful than MCP-based automation because:

  • Native to iOS, always up-to-date
  • Full access to accessibility tree
  • Can wait for elements, handle animations
  • Integrates with Xcode test runner

See XCUITEST_GUIDE.md for complete patterns.

Quick example:

// In a UI test file
func testLogin() {
    let app = XCUIApplication()
    app.launch()

    // Type in text field
    app.textFields["email"].tap()
    app.textFields["email"].typeText("user@example.com")

    // Tap button
    app.buttons["Login"].tap()

    // Verify result
    XCTAssertTrue(app.staticTexts["Welcome"].exists)
}

Run UI tests:

xcodebuild -workspace App.xcworkspace -scheme AppUITests \
  -destination "platform=iOS Simulator,id=$UDID" \
  test

Session Configuration

Unlike MCP, CLI tools don’t maintain session state. Use environment variables or a config file:

# Set up session variables
export XCODE_WORKSPACE="/path/to/App.xcworkspace"
export XCODE_SCHEME="App"
export SIM_UDID="DD5E339B-468E-43C7-B219-54112C9D3250"
export APP_BUNDLE_ID="com.your.app"

# Use in commands
xcodebuild -workspace "$XCODE_WORKSPACE" -scheme "$XCODE_SCHEME" ...
xcrun simctl launch "$SIM_UDID" "$APP_BUNDLE_ID"

Troubleshooting

Build fails with “no matching destination”

# Check available destinations
xcodebuild -workspace App.xcworkspace -scheme App -showDestinations

# Use exact destination string from output

Simulator won’t boot

# Check if already booted
xcrun simctl list devices | grep Booted

# Force shutdown and reboot
xcrun simctl shutdown $UDID
xcrun simctl boot $UDID

Can’t find built .app

# Check derived data path you specified
ls -la /tmp/build/Build/Products/Debug-iphonesimulator/

# Or use default derived data
ls ~/Library/Developer/Xcode/DerivedData/

Key Differences from XcodeBuildMCP

Feature XcodeBuildMCP This Skill
Build build_sim({...}) xcodebuild -workspace ... build
List sims list_sims() xcrun simctl list devices
Launch app launch_app_sim({...}) xcrun simctl launch $UDID $BUNDLE
Screenshot screenshot({...}) xcrun simctl io $UDID screenshot
Tap/Type tap({x,y}), type_text({...}) XCUITest framework
Session state Built-in Environment variables