try Everframe.shared.start(
config: EverframeConfig(
sdkKey: "evf_live_…",
capture: CaptureConfig(network: true)
)
)
EverframeConfig
| Field | Type | Default | What it does |
|---|---|---|---|
sdkKey | String | — | Required. Your SDK key, evf_live_…; not the App ID UUID. Publishable — it only grants report submission. |
environment | Environment | .production | .development, .staging or .production. Currently not read — nothing in the report changes. |
release | String? | nil | Currently not read. The report’s app version comes from your bundle’s CFBundleShortVersionString and CFBundleVersion. |
capture | CaptureConfig | .defaults | What is captured — see below. |
redaction | RedactionConfig | .defaults | Currently not read — the engine ships a fixed rule set. See Redaction. |
companionDeviceId | String? | nil | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
companionBadgeEnabled | Bool | true | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
companionBadgePosition | String? | nil | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
theme | ReporterThemeOptions? | nil | Reporter colours. See Branding. |
installIdentifierEnabled | Bool | true | Send a non-secret per-install identifier at most once a day so installs can be counted toward your plan. Client veto: false turns it off; it cannot force it on. |
reporterEnabled | Bool | true | false makes every session crash-only: no on-device reporter. See Crash-only sessions. |
vitals | VitalsConfig | VitalsConfig() | Session Vitals opt-out / sample rate / source-query capture. See Session vitals. |
CaptureConfig
| Field | Default | What it does |
|---|---|---|
screenshot | true | Capture a screenshot with the report. |
logs | true | Capture console output (stderr). |
network | false | Declares that you have opted into network capture. On its own it captures nothing — requests are captured only on a URLSession you build with networkCaptureConfiguration(). It is a precondition for body capture. See Console & network. |
crash | true | Automatic native crash capture on iOS and tvOS, explicit captureException, and the React Native bridge’s JavaScript crash path. false turns all of them off. See Crash reporting. |
focus | true | Currently not read. Focus capture is not implemented on iOS. |
ringBufferCapacity | 250 | Currently not read — the buffers are fixed-size. Setting it has no effect. |
networkBodies | true | Client veto for body capture. false always wins; true does not force capture on — the server gate still decides. |
networkBodies is a veto, not a switch: bodies are captured only when the
server enables them and capture.network is true and networkBodies
is not false. A client can turn body capture off and can never turn it on.
See Server config.
Crash-only sessions
try Everframe.shared.start(
config: EverframeConfig(sdkKey: "evf_live_…", reporterEnabled: false)
)
reporterEnabled: false turns the on-device reporter off for the whole session:
report.open() throws. Crash and error capture, breadcrumbs, console and
vitals keep working.
Use it in production builds that should report crashes without recording every session. Replay in a crash-only session follows the dashboard’s crash-only coverage, 0% by default, instead of the report coverage, and network bodies are not captured. See Session replay.
Runtime methods
Config is set once; these are called whenever.
| Method | What it does |
|---|---|
report.open() | async throws. Opens the reporter, returns on submit or cancel. Throws unless EFReporterPresenter.installResolver() ran at launch, and in a crash-only session. |
networkCaptureConfiguration(base:) | Returns a URLSessionConfiguration whose sessions are captured. See Console & network. |
setUser(_:) | Attach or clear the end user. nil clears. No-op before start() and after kill(). See Identity. |
setIdentityToken(_:) | Supply a verified identity instead of a self-asserted one. |
addBreadcrumb(message:kind:level:data:) | Add a custom entry to the trail. |
recordScreen(_:data:) | Mark a screen transition. See Screen tracking. |
captureException(_:options:) | Report a caught Swift Error or NSError with optional severity, context, and metadata. See Crash reporting. |
setMetadata(_:) | Currently not read — nothing reaches the report. Use setExtra. |
setExtra(_:) / clearExtra() | Free-form string on the next report, truncated at Everframe.EXTRA_MAX_CHARS (16 384 chars / 16 KiB). Each call replaces the previous value; it is cleared once a report opens. |
markSensitive(_:) | Mask a UIView. Main thread only. See Sensitive content. |
kill() | Stop the SDK and drop buffered evidence for this session. |
Reading current state
Everframe.shared.captureGate // Bool — is capture actually allowed?
Everframe.shared.currentConfig // EverframeConfig?
Everframe.shared.currentUser // EFUser?
Everframe.shared.captureUserSnapshot() // EFCapturedUser
Everframe.shared.captureSessionSnapshot()
Everframe.SDK_VERSION // String
captureGate reports whether capture is armed — start() opens it and
kill() closes it. It is not a summary of the server
feature gates: replay and body capture have their own, so captureGate can be
true while neither is running.
Quick capture
Quick capture files a draft report from a debug simulator with one gesture, with
no form: a screenshot, the replay window, logs, breadcrumbs and network, as for a
manual report. It is armed only on the iOS Simulator (tvOS is not yet
verified); for real devices, see
Quick capture on real devices. Every simulator
build counts as a debug build, so set debugBuild: false in EverframeConfig
to keep it off in a simulator Release build.
Real iPhones and iPads can quick capture too: link one to you or your team under Project settings → Devices, then shake it to capture. A real Apple TV works the same way: link it, then hold Play/Pause on the Siri Remote for about 1.5 s. In a debug build, the hold captures without linking. See Quick capture on real devices.
Press Shift+B in the simulator to capture. It is ignored while a text field has focus, so typing a capital B still types. A live capture card then appears in the dashboard, where you can title the capture and file it as a ticket.
Shift+B is the default because it is also what reaches an Android emulator, so one shortcut works on both. In the dashboard, under the app’s “Quick capture” card, you can pick another shortcut (double-tap Shift, or a chord such as ⌘⇧E), turn quick capture off, or turn off its replay. Saving a shortcut warns you about the ones the iOS Simulator reserves for itself.
You can also trigger a capture from your Mac, without focusing the simulator:
npx @everframe/cli capture
With more than one booted simulator or running emulator, pass --device <id>;
the command lists them and exits when you do not.
To have captures private to you rather than in the shared inbox, log in once:
npx @everframe/cli login
It opens the dashboard, where you allow the login, then saves a personal
capture token to ~/.everframe/credentials, which the SDK reads. Pass
--no-browser to print the URL instead of opening it, or --url <api-url> for
a self-hosted dashboard. The SDK sends the token only to the server it was
issued by (the file’s url), so a debug build pointed at another server files
its captures unattributed. npx @everframe/cli logout revokes the token and
removes the file. You can also create a token yourself in the dashboard
(Settings → Agents → Capture tokens) and save it in that file:
{ "token": "evf_cap_…" }
A missing or invalid token never blocks a capture; it just lands in the shared inbox. Drafts expire from the inbox after 7 days unless filed.
What iOS does not have
There is no debug, disabled or onError field, and no client-side
sessionReplay block — replay is enabled entirely from the server.
Two-way replies are not implemented in the iOS SDK. There is no reply UI and no polling; the feature is web-only today.
To keep Everframe out of a build, do not call start.