iOS Simulator Screenshot Capture Parameters and Options: Complete Guide
The capture_screenshot function in screenshot_utils.py accepts seven core parameters—udid, output_path, size, inline, app_name, screen_name, and state—to control device targeting, image scaling, output format, and semantic naming when capturing iOS Simulator screenshots.
The conorluddy/ios-simulator-skill repository provides a Python utility layer that wraps the xcrun simctl io command, adding intelligent resizing, base64 encoding, and semantic filename generation for automation workflows. Understanding these iOS Simulator screenshot capture parameters and options allows you to optimize image size for token-constrained LLM vision models or generate organized file archives during test recording.
Core Capture Parameters
The primary entry point capture_screenshot (defined in ios-simulator-skill/scripts/common/screenshot_utils.py) exposes a typed interface for controlling every aspect of screenshot acquisition.
Device Targeting and Output Destination
udid(str, required): The device identifier of the target simulator. This maps directly to thexcrun simctl io <udid> screenshotcommand argument.output_path(str | None): Explicit filesystem destination for the captured image. When omitted, the function invokesgenerate_screenshot_nameto create a semantic filename based on contextual metadata.
Image Sizing and Scaling Presets
The size parameter accepts four string presets that determine scaling factors for token-optimized or storage-efficient captures:
"full": 1.0× scale (original resolution)"half": 0.5× scale (default)"quarter": 0.25× scale"thumb": 0.1× scale
Internally, capture_screenshot delegates to get_size_preset(size) to map these strings to coordinate tuples, then conditionally calls resize_screenshot using Lanczos filtering when the preset differs from "full".
Inline vs. File Output Modes
The inline boolean toggles between two distinct return formats:
inline=False(default): Returns a dictionary with'mode': 'file', including'file_path','size_bytes','width','height', and'size_preset'.inline=True: Returns a dictionary with'mode': 'inline', containing'base64_data'(PNG),'mime_type': 'image/png', plus dimensions and preset metadata.
Inline mode is particularly useful for vision-based automation pipelines where images must be passed directly to LLM APIs without filesystem I/O.
Semantic Filename Components
When output_path is omitted, three optional parameters drive the automatic filename generator:
app_name(str | None): Application identifier (e.g., "MyApp")screen_name(str | None): Logical screen identifier (e.g., "Login", "Dashboard")state(str | None): Descriptive state (e.g., "Empty", "Error", "Loaded")
These values feed into generate_screenshot_name, which concatenates them with a timestamp to produce human-readable paths like MyApp_Login_Empty_20240115_143022.png.
Implementation Details in screenshot_utils.py
The capture workflow follows a strict four-step pipeline inside ios-simulator-skill/scripts/common/screenshot_utils.py:
- Execute
xcrun simctl io <udid> screenshot <temp_path>to generate a raw PNG - If
sizeis not"full"and Pillow is available, callresize_screenshotto scale the image using the preset factor - For inline mode: Read the (possibly resized) image, base64-encode it, delete temporary files, and return the data URI structure
- For file mode: Move or save the image to the final
output_pathand return filesystem metadata
Size Preset Resolution Mapping
The helper get_size_preset (lines 78-86) implements the scaling lookup:
# Mapping from screenshot_utils.py
presets = {
"full": (1.0, 1.0),
"half": (0.5, 0.5),
"quarter": (0.25, 0.25),
"thumb": (0.1, 0.1)
}
Image Processing Pipeline
The resize_screenshot function (lines 100-108) handles the actual pixel manipulation:
- Opens source image via Pillow (PIL)
- Computes new dimensions using the preset scaling factor
- Applies Lanczos resampling (high-quality downsampling)
- Saves with JPEG quality 85 by default, or PNG preservation based on context
- Generates suffixed filenames (e.g.,
_half,_thumb) whenoutput_pathis not explicitly provided
Practical Code Examples
Capturing Base64 Inline Screenshots
Use this pattern for vision-based automation where you need to send image data directly to an API:
from ios_simulator_skill.scripts.common.screenshot_utils import capture_screenshot
result = capture_screenshot(
udid="A1B2C3D4-5678-90AB-CDEF-1234567890AB",
size="quarter", # Token-friendly reduced size
inline=True, # Return base64 data instead of file
app_name="MyApp",
screen_name="Login",
state="Empty"
)
# Access the base64 PNG data
print(result["base64_data"][:60] + "...")
print(f"Dimensions: {result['width']}x{result['height']}")
File Mode with Automatic Semantic Naming
When you want persistent storage with organized filenames:
from ios_simulator_skill.scripts.common.screenshot_utils import capture_screenshot
result = capture_screenshot(
udid="A1B2C3D4-5678-90AB-CDEF-1234567890AB",
size="full", # Preserve original resolution
inline=False, # Write to filesystem
app_name="MyApp",
screen_name="Home",
state="Loaded"
)
print("Saved to:", result["file_path"])
print(f"Size on disk: {result['size_bytes']} bytes")
Integration with Test Recorders
The TestRecorder class in ios-simulator-skill/scripts/test_recorder.py demonstrates production usage by wrapping the same utility:
recorder.step(
description="Verify dashboard rendering",
screen_name="Dashboard",
state="Ready"
)
# Internally invokes capture_screenshot with the recorder's configured size/inline flags
Summary
- The
capture_screenshotfunction inscreenshot_utils.pywrapsxcrun simctl iowith seven configurable parameters for device targeting, sizing, and naming. - Four size presets (
full,half,quarter,thumb) control scaling factors from 1.0× down to 0.1×, processed via Lanczos filtering inresize_screenshot. - The
inlineparameter switches between file output (with semantic naming viaapp_name,screen_name,state) and base64-encoded PNG data for direct API consumption. - All processing logic resides in
ios-simulator-skill/scripts/common/screenshot_utils.py, with workflow examples available intest_recorder.py.
Frequently Asked Questions
What are the valid values for the size parameter in iOS Simulator screenshot capture?
The size parameter accepts four string presets defined in get_size_preset: "full" (1.0×), "half" (0.5×), "quarter" (0.25×), and "thumb" (0.1×). The default value is "half", which provides a balance between image clarity and token efficiency for LLM vision tasks.
How does inline mode differ from file mode when capturing screenshots?
When inline=True, capture_screenshot returns a dictionary containing base64_data (a base64-encoded PNG string) and removes temporary files after encoding. When inline=False (the default), the function writes the image to disk and returns a dictionary with file_path, size_bytes, and dimensions. Inline mode eliminates filesystem overhead for API-based automation, while file mode is preferable for debugging and archival purposes.
What happens if I don't specify an output_path when capturing a screenshot?
If output_path is None, the function calls generate_screenshot_name to construct a semantic filename using the optional app_name, screen_name, and state parameters combined with a timestamp. If no semantic components are provided, it falls back to screenshot_<timestamp>.png format. The file is saved to the current working directory or the system's temporary folder depending on the execution context.
Can I capture screenshots without the Pillow library installed?
Yes, but with limitations. If Pillow is not available, capture_screenshot will still execute xcrun simctl io <udid> screenshot and return the raw PNG. However, any size preset other than "full" will be ignored because resize_screenshot depends on Pillow for Lanczos filtering and dimension calculations. For production use, install Pillow to ensure all scaling presets function correctly.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →