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:
@@ -125,3 +125,22 @@ to the Files folder, the Photos "Connect" album, Manage storage — works withou
|
||||
Also enabled by this change (main app Info.plist, done automatically by `ios-patch.sh`):
|
||||
- `UIFileSharingEnabled` + `LSSupportsOpeningDocumentsInPlace` → the **Biz Connect** folder in Files.
|
||||
- `CFBundleURLTypes` scheme **`bizconnect`** → lets the extension bounce back into the app after staging.
|
||||
|
||||
## Broadcast Extension (share your iPhone SCREEN in a call) — one-time Apple portal setup
|
||||
|
||||
Screen sharing from iOS uses a **Broadcast Upload Extension** (`com.bizgaze.connect.broadcast`) — the same
|
||||
pattern as the Share Extension. The Codemagic build injects the target, links LiveKit into it, and fetches a
|
||||
profile automatically, but the **App Group capability can only be toggled by hand** in the Apple portal:
|
||||
|
||||
1. Reuse the SAME App Group as the Share Extension: **`group.com.bizgaze.connect`** (no new group needed).
|
||||
2. **Enable the App Groups capability on the broadcast App ID** and assign it to that group:
|
||||
- `com.bizgaze.connect.broadcast` (create this App ID if the first build hasn't yet — `fetch-signing-files
|
||||
--create` registers it, then edit it to add App Groups). The app (`com.bizgaze.connect`) already has the
|
||||
group from the Share Extension setup above.
|
||||
After enabling it, re-run the Codemagic build so `fetch-signing-files` regenerates the profile.
|
||||
|
||||
Until the App Group is on the broadcast App ID, the **archive fails code-signing** (entitlement mismatch) —
|
||||
that's the expected first-build failure. The shared App Group is how the extension (ReplayKit capture) hands
|
||||
screen frames to the app over LiveKit's IPC socket. Receiving OTHERS' shared screens needs none of this — it
|
||||
already works. `ios-patch.sh` sets `RTCScreenSharingExtension` + `RTCAppGroupIdentifier` in the app Info.plist
|
||||
so LiveKit finds the extension + group.
|
||||
|
||||
Reference in New Issue
Block a user