Skip to content

Mobile applications

Install SeatLayer for React Native, Flutter, native iOS, or native Android, with typed holds, events, and secure mobile bridges.

Updated View as Markdown

SeatLayer offers public React Native, Flutter, iOS, and Android SDK source alongside the production web SDK. React Native is available as @seatlayer/react-native, Flutter as seatlayer, iOS through Swift Package Manager, and native Android as a Kotlin/JitPack public preview.

Choose a mobile surface

Flutter package

Install seatlayer for a typed Flutter view, controller, commands, and event streams on iOS and Android.

iOS SDK preview

Evaluate the public seatlayer/seatlayer-ios Swift package from main until the first production tag is documented.

Android SDK preview

Use the native Kotlin seatlayer/seatlayer-android package with coroutines, typed flows, and an origin-restricted WebKit bridge.

Controlled webview

Host your own page with @seatlayer/js when you need the stable web SDK today or want to own a narrow native-to-web checkout bridge.

Mobile web

Open SeatPicker directly in the browser for its responsive bottom sheet, touch controls, holds, checkout callback, and optional 3D.

Install a native SDK

npm install @seatlayer/react-native react-native-webview
SeatMapScreen.tsxtsx
import {
  SeatLayerView,
  useSeatLayerController,
} from "@seatlayer/react-native";

export function SeatMapScreen() {
  const controller = useSeatLayerController();

  return (
    <SeatLayerView
      style={{ flex: 1 }}
      controller={controller}
      configuration={{
        event: "ev_your_event_key",
        currency: "USD",
      }}
      onReady={(info) => console.log("SeatLayer ready", info.mode)}
      onLoadError={(error) => console.error(error.code, error.message)}
    />
  );
}

The package includes a typed controller, correlated errors, stale-event protection, and a vendored web runtime. See the React Native README and runnable Expo example before adopting the preview.

flutter pub add seatlayer
seat_map.dartdart
import "package:seatlayer/seatlayer.dart";

final controller = SeatLayerController();

SizedBox(
  height: 640,
  child: SeatLayerView(
    controller: controller,
    configuration: SeatLayerConfiguration(
      event: "ev_your_event_key",
      currency: "USD",
    ),
    onReady: (info) {
      debugPrint("SeatLayer ready: ${info.mode.raw}");
    },
  ),
);

Dispose the controller with the host state. See the Flutter package README for commands, event streams, the offline example, and preview constraints.

In Xcode, choose File → Add Package Dependencies and enter:

https://github.com/seatlayer/seatlayer-ios.git

Select the main branch for evaluation until this page documents a stable tag.

SeatMapViewController.swiftswift
import SeatLayer

let map = SeatLayerView()
map.delegate = self

var configuration = SeatLayerConfiguration(
    event: "ev_your_event_key",
    currency: "USD"
)

let info = try await map.load(configuration)
let hold = try await map.hold()

Read the iOS SDK README before adopting the branch dependency.

Add JitPack to dependency resolution, restricted to the SeatLayer package:

settings.gradle.ktskotlin
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven("https://jitpack.io") {
            content {
                includeGroup("com.github.seatlayer")
            }
        }
    }
}

Install the exact preview tag:

app/build.gradle.ktskotlin
dependencies {
    implementation(
        "com.github.seatlayer:seatlayer-android:v0.1.0",
    )
}
CheckoutActivity.ktkotlin
val seatMap = SeatLayerView(this)
setContentView(seatMap)

lifecycleScope.launch {
    seatMap.load(
        SeatLayerConfiguration(
            event = "ev_your_event_key",
            currency = "USD",
        ),
    )
}

Collect seatMap.controller.events, use its suspending hold and view commands, and call seatMap.destroy() with the screen. Read the Android SDK README and bridge reference.

Host an immutable integration page using the current @seatlayer/js release. Bridge only the checkout and application events your native shell needs.

mobile-webview.txttext
Native screen
  └─ owned WebView
       └─ immutable SeatLayer integration page
            ├─ SeatPicker
            ├─ event inventory over HTTPS/realtime
            └─ narrow validated message bridge
                 └─ native checkout / navigation

Shared native contract

The React Native, iOS, Android, and Flutter SDKs use a versioned bridge and intentionally mirror the web SeatingChart contract:

hold, resumeHold, extendHold, release, releaseLabels, bestAvailable, holdGA, setSeatTier, getSelection, getCurrentHold, getGAAreas, getFloors, setFloor, setColorblindSafe, view and zoom methods, and destroy.

Command failures correlate to the awaited native call with structured errors. Unknown future events and enum values are retained as unknown values rather than crashing older applications.

Security boundary

Keep secret-key booking in your backend. A native binary or webview may receive a holdId, but never the secret.

  • The app selects and holds; your trusted server inspects and books.
  • Calculate payment from server-inspected hold items, not app input.
  • Reuse the host order id as bookingRef for retry safety.
  • Validate webview bridge source/origin and message schemas.
  • Treat hold expiry and inventory conflicts as recoverable buyer states.

Layout and lifecycle requirements

  • Give the map a definite height or make it full-screen.
  • Do not nest it inside another gesture-driven scroll or zoom surface.
  • Preserve the hold id across checkout navigation and app suspension when your product promises restoration.
  • Dispose or destroy the SDK with its native screen.
  • Test safe areas, rotation, back navigation, keyboards, process suspension, and resume.
  • Test 2D fallback when the target environment cannot support optional 3D.

Preview verification checklist

  • The dependency resolves from its registry or exact documented release.
  • The package version or Git revision is pinned intentionally.
  • No secret key exists in the native binary, WebView, or logs.
  • A test event renders and receives live inventory.
  • Select, hold, checkout, expiry, release, and conflict paths work.
  • Gestures do not conflict with parent scrolling.
  • iOS and Android physical-device smoke tests pass.
  • The backend books with a stable bookingRef.

Explore the live buyer demo, continue with holds and checkout, or give an agent the SeatLayer AI Toolkit.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close