iOS Simulator Skill
Build, test, and automate iOS applications using accessibility-driven navigation and structured data instead of pixel coordinates.
Quick Start
1. Check environment
bash scripts/sim_health_check.sh
2. Launch app
python scripts/app_launcher.py --launch com.example.app
3. Map screen to see elements
python scripts/screen_mapper.py
4. Tap button
python scripts/navigator.py --find-text "Login" --tap
5. Enter text
python scripts/navigator.py --find-type TextField --enter-text "user@example.com"
All scripts support --help for detailed options and --json for machine-readable output.
21 Production Scripts
Build & Development (2 scripts)
build_and_test.py - Build Xcode projects, run tests, parse results with progressive disclosure
-
Build with live result streaming
-
Parse errors and warnings from xcresult bundles
-
Retrieve detailed build logs on demand
-
Options: --project , --scheme , --clean , --test , --verbose , --json
log_monitor.py - Real-time log monitoring with intelligent filtering
-
Stream logs or capture by duration
-
Filter by severity (error/warning/info/debug)
-
Deduplicate repeated messages
-
Options: --app , --severity , --follow , --duration , --output , --json
Navigation & Interaction (5 scripts)
screen_mapper.py - Analyze current screen and list interactive elements
-
Element type breakdown
-
Interactive button list
-
Text field status
-
Options: --verbose , --hints , --json
navigator.py - Find and interact with elements semantically
-
Find by text (fuzzy matching)
-
Find by element type
-
Find by accessibility ID
-
Enter text or tap elements
-
Options: --find-text , --find-type , --find-id , --tap , --enter-text , --json
gesture.py - Perform swipes, scrolls, pinches, and complex gestures
-
Directional swipes (up/down/left/right)
-
Multi-swipe scrolling
-
Pinch zoom
-
Long press
-
Pull to refresh
-
Options: --swipe , --scroll , --pinch , --long-press , --refresh , --json
keyboard.py - Text input and hardware button control
-
Type text (fast or slow)
-
Special keys (return, delete, tab, space, arrows)
-
Hardware buttons (home, lock, volume, screenshot)
-
Key combinations
-
Options: --type , --key , --button , --slow , --clear , --dismiss , --json
app_launcher.py - App lifecycle management
-
Launch apps by bundle ID
-
Terminate apps
-
Install/uninstall from .app bundles
-
Deep link navigation
-
List installed apps
-
Check app state
-
Options: --launch , --terminate , --install , --uninstall , --open-url , --list , --state , --json
Testing & Analysis (5 scripts)
accessibility_audit.py - Check WCAG compliance on current screen
-
Critical issues (missing labels, empty buttons, no alt text)
-
Warnings (missing hints, small touch targets)
-
Info (missing IDs, deep nesting)
-
Options: --verbose , --output , --json
visual_diff.py - Compare two screenshots for visual changes
-
Pixel-by-pixel comparison
-
Threshold-based pass/fail
-
Generate diff images
-
Options: --threshold , --output , --details , --json
test_recorder.py - Automatically document test execution
-
Capture screenshots and accessibility trees per step
-
Generate markdown reports with timing data
-
Options: --test-name , --output , --verbose , --json
app_state_capture.py - Create comprehensive debugging snapshots
-
Screenshot, UI hierarchy, app logs, device info
-
Markdown summary for bug reports
-
Options: --app-bundle-id , --output , --log-lines , --json
sim_health_check.sh - Verify environment is properly configured
-
Check macOS, Xcode, simctl, IDB, Python
-
List available and booted simulators
-
Verify Python packages (Pillow)
Advanced Testing & Permissions (4 scripts)
clipboard.py - Manage simulator clipboard for paste testing
-
Copy text to clipboard
-
Test paste flows without manual entry
-
Options: --copy , --test-name , --expected , --json
status_bar.py - Override simulator status bar appearance
-
Presets: clean (9:41, 100% battery), testing (11:11, 50%), low-battery (20%), airplane (offline)
-
Custom time, network, battery, WiFi settings
-
Options: --preset , --time , --data-network , --battery-level , --clear , --json
push_notification.py - Send simulated push notifications
-
Simple mode (title + body + badge)
-
Custom JSON payloads
-
Test notification handling and deep links
-
Options: --bundle-id , --title , --body , --badge , --payload , --json
privacy_manager.py - Grant, revoke, and reset app permissions
-
13 supported services (camera, microphone, location, contacts, photos, calendar, health, etc.)
-
Batch operations (comma-separated services)
-
Audit trail with test scenario tracking
-
Options: --bundle-id , --grant , --revoke , --reset , --list , --json
Device Lifecycle Management (5 scripts)
simctl_boot.py - Boot simulators with optional readiness verification
-
Boot by UDID or device name
-
Wait for device ready with timeout
-
Batch boot operations (--all, --type)
-
Performance timing
-
Options: --udid , --name , --wait-ready , --timeout , --all , --type , --json
simctl_shutdown.py - Gracefully shutdown simulators
-
Shutdown by UDID or device name
-
Optional verification of shutdown completion
-
Batch shutdown operations
-
Options: --udid , --name , --verify , --timeout , --all , --type , --json
simctl_create.py - Create simulators dynamically
-
Create by device type and iOS version
-
List available device types and runtimes
-
Custom device naming
-
Returns UDID for CI/CD integration
-
Options: --device , --runtime , --name , --list-devices , --list-runtimes , --json
simctl_delete.py - Permanently delete simulators
-
Delete by UDID or device name
-
Safety confirmation by default (skip with --yes)
-
Batch delete operations
-
Smart deletion (--old N to keep N per device type)
-
Options: --udid , --name , --yes , --all , --type , --old , --json
simctl_erase.py - Factory reset simulators without deletion
-
Preserve device UUID (faster than delete+create)
-
Erase all, by type, or booted simulators
-
Optional verification
-
Options: --udid , --name , --verify , --timeout , --all , --type , --booted , --json
Common Patterns
Auto-UDID Detection: Most scripts auto-detect the booted simulator if --udid is not provided.
Device Name Resolution: Use device names (e.g., "iPhone 16 Pro") instead of UDIDs - scripts resolve automatically.
Batch Operations: Many scripts support --all for all simulators or --type iPhone for device type filtering.
Output Formats: Default is concise human-readable output. Use --json for machine-readable output in CI/CD.
Help: All scripts support --help for detailed options and examples.
Typical Workflow
-
Verify environment: bash scripts/sim_health_check.sh
-
Launch app: python scripts/app_launcher.py --launch com.example.app
-
Analyze screen: python scripts/screen_mapper.py
-
Interact: python scripts/navigator.py --find-text "Button" --tap
-
Verify: python scripts/accessibility_audit.py
-
Debug if needed: python scripts/app_state_capture.py --app-bundle-id com.example.app
Requirements
-
macOS 12+
-
Xcode Command Line Tools
-
Python 3
-
IDB (optional, for interactive features)
Documentation
-
SKILL.md (this file) - Script reference and quick start
-
README.md - Installation and examples
-
CLAUDE.md - Architecture and implementation details
-
references/ - Deep documentation on specific topics
-
examples/ - Complete automation workflows
Key Design Principles
Semantic Navigation: Find elements by meaning (text, type, ID) not pixel coordinates. Survives UI changes.
Token Efficiency: Concise default output (3-5 lines) with optional verbose and JSON modes for detailed results.
Accessibility-First: Built on standard accessibility APIs for reliability and compatibility.
Zero Configuration: Works immediately on any macOS with Xcode. No setup required.
Structured Data: Scripts output JSON or formatted text, not raw logs. Easy to parse and integrate.
Auto-Learning: Build system remembers your device preference. Configuration stored per-project.
Use these scripts directly or let Claude Code invoke them automatically when your request matches the skill description.