FAQ

FAQ

Do I need a server?

Yes. The plugin is client-side only. For WHIP/WHEP use SRS, ZLMediaKit or MediaMTX; for rooms use a LiveKit server. For anything custom, implement RtcSignaling / RtcSession.

Do I really need TURN?

For anything outside your own LAN: yes. Camera and robot NATs are frequently symmetric or behind CGNAT, where STUN alone cannot punch through. RelayPlanner will escalate to RelayMode.forced after relayAfterAttempts failed attempts.

Why does clarity switching fail on my camera?

Because it publishes a single layer. There is no software clarity switch on a single-layer stream. Either transcode server-side or publish main/sub streams as separate stream ids (_sd / _hd / _fhd), which the plugin will switch between (expect a 1–2 s blink).

Why is my video frozen while the UI says “connected”?

ICE state is not media state. MediaHealthMonitor exists precisely for this: it classifies frozen from stats and escalates to a keyframe request and then a re-subscribe. Render LinkPhase.degraded as a warning, never as “connected”.

Why does the plugin rebuild the peer connection on a handover?

WHIP/WHEP (RFC 9725) forbids renegotiation after the initial SDP, so an ICE restart is expressed as a fresh peer connection with a fresh ICE configuration. Track changes never do this — they use replaceTrack.

Why must I confirm a resume?

Because the alternative is dangerous. Commands captured before the interruption (a joystick pushed left while the app was backgrounded) are no longer valid when the link returns. PauseResumeGate bumps an epoch on every pause so those operations are dropped, and requires an explicit confirmation to start a new epoch.

Can I disable the pause/resume flow?

You can pass no gate (legacy behaviour) or call resumeImmediately(afterReconnect: true) in a custom policy. Both are explicit opt-outs; neither is the default.

Why is my BLE provisioning dependency different from the ESP docs?

esp_provisioning_ble pins protobuf ^3, which conflicts with livekit_client’s protobuf ^4/^6. The plugin implements protocomm Security1 directly (lib/src/device/protocomm.dart) with cryptography, so no protobuf dependency remains.

iOS: can I use NFC tap-to-provision?

Read-only, and only with the entitlement com.apple.developer.nfc.readersession.formats — which requires a paid account and an explicit App ID (no wildcards). iOS cannot emulate tags (HCE).

iOS: can the app connect to a device hotspot automatically?

No. Apple forbids programmatic Wi-Fi joining. Guide the user to Settings.

Android 14: why does background audio crash?

Missing FOREGROUND_SERVICE_MICROPHONE and foregroundServiceType="microphone". Android throws SecurityException at service start. The plugin ships RtcLinkForegroundService and merges the declaration.

Can I test on a simulator?

Only UI and logic. iOS Simulator has no camera, NFC or Bluetooth; the Android emulator cannot do BLE, NFC or SoftAP. Device management needs real hardware.

Where is the Chinese documentation?

Under /zh.