Skip to content
Swift · iOS / iPadOS / tvOS

The Everframe iOS SDK.

One Swift package for iPhone, iPad and Apple TV. Native screenshot, wireframe replay, breadcrumbs.

// SPM
.package(url: "github.com/scriptx-com/everframe"
iOS 15+iPadOS 15+tvOS 15+

A binary Swift package. Start it once, open the reporter from your own button, and every report carries a native screenshot, a wireframe replay of the last seconds, console, the trail of screens and device. Network capture is off until you turn it on. On tvOS the companion does the reporting.

Three steps

1Add the package — both products
// Package.swift
.package(url: "https://github.com/scriptx-com/everframe", from: "0.9.0")
// link the Everframe AND EverframeReporterUI products

// or CocoaPods
pod 'Everframe'
pod 'Everframe/ReporterUI'
2Start it once, and install the reporter
import EverframeKit
import EverframeReporterUI

EFReporterPresenter.installResolver()   // once, at launch
try Everframe.shared.start(
  config: EverframeConfig(appId: "evf_live_…")
)
3Open it from your own button
Task {
  let result = try await Everframe.shared.report.open()
}

What it captures

Screenshot A native capture of exactly what UIKit or SwiftUI drew, with the reporter's annotations no screen-recording prompt
Session replay Wireframe timeline of what the app rendered — layout and real text, not pixels no permission, no video file
Console Last 100 console lines capture.logs, on by default
Network Requests with status and duration, on URLSessions you build with networkCaptureConfiguration() opt-in per session; bodies are a separate per-app gate
Screens UIKit pushes and presentations recorded automatically; SwiftUI screens in one line each
Focused component Not captured on iOS today — the screenshot and the screen trail carry the context
Crash reports Not filed on native iOS today — an uncaught NSException is recorded as an error breadcrumb and passed to your existing crash reporter
Device and app Model, OS version, screen, locale, timezone, app version

What you wire yourself

  • The trigger. No floating bubble; your own button calls report.open(). Without EFReporterPresenter.installResolver() at launch, open() throws.
  • Network capture, if you want it: build the URLSession with Everframe.shared.networkCaptureConfiguration(), and set CaptureConfig(network: true) if you also want bodies.
  • Sensitive views. Mark them and they are masked before the screenshot leaves the device.
  • SwiftUI screen names, one line per screen; UIKit needs nothing.

When to pick it

Native iPhone, iPad and Apple TV apps, UIKit or SwiftUI. Start it in the app delegate, keep your own button, and the SDK handles capture, signing and delivery. React Native apps take the React Native SDK instead; it wraps this one.

What is native about it

The screenshot is a native render of the current window, so it needs no screen-recording permission and includes nothing the app cannot see. Replay is a wireframe timeline of the view hierarchy — layout and real text, deliberately not pixels — which is why it is silent and small. UIKit navigation is recorded automatically; SwiftUI has nothing to observe, so each screen is one line, covered in screen tracking.

On Apple TV

The same package runs on tvOS, but nothing is typed on the television. The SDK shows the pairing badge and the PIN card; a phone or the dashboard files the report. The tvOS page walks through it.

Questions

Does one SDK cover iPhone, iPad and Apple TV?

Yes. The same package targets iOS, iPadOS and tvOS 15 and later, producing the identical envelope on each. On tvOS the reporter is the companion — a phone or the dashboard — not an on-screen UI.

How is it distributed?

As a binary via Swift Package Manager from the public scriptx-com/everframe repository, with a CocoaPods pod as well.

Why is network capture off by default?

So a report never carries request data you did not decide to send. Only URLSessions built with Everframe.shared.networkCaptureConfiguration() are captured — URLSession.shared never is; request and response bodies are a separate per-app switch.