[bug] iOS: `useiOSBroadcastExtension: false` ignored since 2.4.0, in-app capture unreachable
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 55/100
Direzione di ricerca
Start in lib/src/participant/local.dart and trace how the effective ScreenShareCaptureOptions are chosen before the iOS broadcast branch; then read ios/Classes/BroadcastManager.swift to understand the missing-extension guard. Done means useiOSBroadcastExtension: false reaches in-app capture, while a requested broadcast flow without an extension reports an error rather than silently returning success. Check for existing screen-share tests before adding coverage.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
Since 2.4.0, setScreenShareEnabled(true) on iOS unconditionally routes into the Broadcast Upload Extension flow. ScreenShareCaptureOptions.useiOSBroadcastExtension still exists, but false (the documented in-app RPScreenRecorder mode through 2.3.6) has no effect.
lib/src/participant/local.dart (2.4.0–2.10.0 and current main):
if (lkPlatformIs(PlatformType.iOS) && !BroadcastManager().isBroadcasting) {
// Wait until broadcasting to publish track
await BroadcastManager().requestActivation();
return null;
}
The branch precedes any capture options inspection; the in-app path below it is unreachable.
Worse, without an extension: requestActivation()'s native side (ios/Classes/BroadcastManager.swift) guard-returns when the RTCScreenSharingExtension Info.plist key is absent:
func requestActivation() {
guard let bundleIdentifier = BroadcastBundleInfo.screenSharingExtension else { return }
Task { await Self.showPicker(for: bundleIdentifier) }
}
No picker, no consent UI, no error, and no log so the call resolves null as success.
This appears to be an unintended side effect of #705 ("fix: Properly handle broadcast capture state"): the PR documents its async-return breaking change but never mentions useiOSBroadcastExtension or the in-app path. That capturer still works in flutter_webrtc, reachable via LocalVideoTrack.createScreenShareTrack() + publishVideoTrack() which is our current workaround.
Broadcast extension capture is always whole screen; in-app capture is scoped to the app's own UI. For privacy sensitive products (share this app with a support agent, never the user's other apps or notifications), app scoped capture is impossible through the public screenshare API on every released version.
To Reproduce
- Flutter app on a physical iPhone,
livekit_client≥ 2.4.0, no Broadcast Upload Extension target. - Connect to a room, then:
await room.localParticipant!.setScreenShareEnabled( true, screenShareCaptureOptions: const ScreenShareCaptureOptions(useiOSBroadcastExtension: false), ); - The call resolves (
null); no consent UI, no published track, nothing logged. Remote participants receive nothing. - On 2.3.6 the same code shows the ReplayKit consent alert and publishes an in-app screenshare track.
Expected behavior
useiOSBroadcastExtension: false(explicit or viaRoomOptions.defaultScreenShareCaptureOptions) uses the in-app capturer, as through 2.3.6 . The gate should consult the effective capture options before routing toBroadcastManager.- Independently: when the broadcast flow is requested but
RTCScreenSharingExtensionis missing, fail loudly (throw or error event) instead of a silentnull. Currently misconfiguration looks like success.
Platform information
- Flutter version: 3.44.2
- Plugin version: reproduced on 2.7.0 and 2.10.0 ; unchanged on
main, 2026-08-04 - Flutter target OS: iOS (real device, iPhone 17)
- Flutter target OS version: iOS 26.4
- Flutter console log: n/a, failure produces no output
- Lingua principale
- Dart
- Stelle
- 421
- Fork
- 260
- Merge medio
- 2g 5h
- PR unite (30g)
- 17
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di livekit/client-sdk-flutter
-
`jwtPayload.video` returns null grants for tokens from LiveKit server SDKsForse già presa @RaphaelFakhri l’ha presa 4 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
livekit/client-sdk-flutter#1236 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
livekit/client-sdk-flutter#1227 ·
I maintainer di solito rispondono entro 1 giorno
-
Inbound data packets never delivered while media flows normally (2.13.0, LiveKit Cloud 1.13.7)Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
livekit/client-sdk-flutter#1221 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 30/100
livekit/client-sdk-flutter#1219 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
iOS: `audioDeviceModule` becomes permanently `nil`/unavailable after backgrounding, even though `AVAudioSession` is never interruptedForse già presa @hiroshihorie l’ha presa 29 giorni fa. Aperta
livekit/client-sdk-flutter#1206 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di livekit/client-sdk-flutter
Issue simili
-
backlog:low bug localization
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
simonoppowa/OpenNutriTracker#1366 ·
I maintainer di solito rispondono entro 1 giorno
-
backlog documentation good first issue priority: medium
Difficoltà 2/5 Mezza giornata Idoneità per principianti 78/100
-
coverage 1.16.0: format_coverage fails on the `{}` that `dart test --coverage` writes for fully skipped suitesForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno
-
The icons in "Tracks"Apertafeature
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
finamp-app/finamp#1804 ·
I maintainer di solito rispondono entro 9 giorni
-
fyi-ecosystem platform-ios team-ios
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 70/100
flutter/flutter#194348 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno