[bug] iOS: `useiOSBroadcastExtension: false` ignored since 2.4.0, in-app capture unreachable
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 55/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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
- Lenguaje dominante
- Dart
- Estrellas
- 421
- Forks
- 260
- Merge medio
- 2 d 5 h
- PR fusionados (30 d)
- 17
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de livekit/client-sdk-flutter
-
`jwtPayload.video` returns null grants for tokens from LiveKit server SDKsPosiblemente ocupada @RaphaelFakhri la tomó hace 3 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
livekit/client-sdk-flutter#1236 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
livekit/client-sdk-flutter#1227 ·
Los mantenedores suelen responder en 1 día
-
Inbound data packets never delivered while media flows normally (2.13.0, LiveKit Cloud 1.13.7)Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
livekit/client-sdk-flutter#1221 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
livekit/client-sdk-flutter#1219 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
iOS: `audioDeviceModule` becomes permanently `nil`/unavailable after backgrounding, even though `AVAudioSession` is never interruptedPosiblemente ocupada @hiroshihorie la tomó hace 28 días. Abierto
livekit/client-sdk-flutter#1206 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de livekit/client-sdk-flutter
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día
-
fyi-ecosystem platform-ios team-ios
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
flutter/flutter#194348 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
documentation good first issue
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
djazairdev/wilayas#22 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 80/100
rajput-hemant/calculator#199 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
leancodepl/app-rating#35 ·