Outgoing iOS screen-share via ReplayKit broadcast extension
Lets a native-call user share their iPhone screen (whole device, works backgrounded). LiveKit 2.15.3 ships the broadcast stack (BroadcastManager + LKSampleHandler + IPC), so: - New Broadcast Upload Extension target "BroadcastExtension" (com.bizgaze.connect.broadcast): SampleHandler.swift subclasses LKSampleHandler; injected by mobile/scripts/add-broadcast-extension.rb which also LINKS the LiveKit SPM product into the extension + sets the App Group. Sources in mobile/ios-broadcast/. - Plugin: Room created with ScreenShareCaptureOptions(useBroadcastExtension: true); startScreenShare -> BroadcastManager.requestActivation() (system picker); stopScreenShare -> requestStop(); BroadcastManagerDelegate -> fires screenShareState to the web. LiveKit auto-publishes the track. - ios-patch.sh: RTCScreenSharingExtension + RTCAppGroupIdentifier keys. - codemagic.yaml: run the injector + sign the 3rd bundle id (.broadcast). - home.html: toggleScreen native -> start/stop; screenShareState listener reflects state + broadcasts meeting-screen so peers' stage shows it. REQUIRES a one-time manual Apple portal step: enable the App Group on the com.bizgaze.connect.broadcast App ID (see mobile/IOS_SETUP.md) or the archive fails code-signing. SPM-linked extension is new on our CI — expect build iteration. Web deployed (no-ops on builds without startScreenShare). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
import ReplayKit
|
||||
import LiveKit
|
||||
|
||||
// Principal class of the Broadcast Upload Extension (ReplayKit) that lets the iOS user share their screen.
|
||||
//
|
||||
// HOW IT WORKS: when the user starts a system broadcast, iOS launches THIS extension. LiveKit's LKSampleHandler
|
||||
// does everything — on broadcastStarted it opens an IPC socket in the shared App Group (group.com.bizgaze.connect)
|
||||
// and streams the ReplayKit sample buffers to the MAIN app, whose LiveKit connection publishes them as a
|
||||
// screen-share track. The extension itself never creates a Room / initialises WebRTC, so it stays well under the
|
||||
// 50 MB extension memory limit. So this subclass can be empty.
|
||||
//
|
||||
// The extension finds the app group + reports state to the app via LiveKit's Darwin-notification/socket
|
||||
// convention, keyed off this extension's bundle id (com.bizgaze.connect.broadcast) and the default app group
|
||||
// group.<appBundleId>. Both are also set explicitly on the app side (RTCScreenSharingExtension /
|
||||
// RTCAppGroupIdentifier in Info.plist) so there's no ambiguity.
|
||||
class SampleHandler: LKSampleHandler {}
|
||||
Reference in New Issue
Block a user