- RevueSDK
- LocalParticipant
- setScreenShare(enabled:)
Instance Method
setScreenShare(enabled:)
啟用/停用螢幕分享硬體擷取(iOS)— 純設備控制,不 publish
@discardableResult func setScreenShare(enabled: Bool) async throws -> LocalVideoTrack?Parameters
- enabled
true = 開硬體擷取, false = 關硬體擷取
Return Value
螢幕分享 LocalVideoTrack(後續可透過 publish(videoTrack:to:options:) 發布給 指定對象)。只要 enabled=true 被呼叫,track 就一定建好並回傳(track / 硬體 / publish 三者獨立)—— 回傳非 nil 不代表「已在擷取」:Broadcast 第一階段回傳的 track 其 capturer 尚未 startCapture(等使用者按開始 → 第二階段自動啟動)。實際「擷取中」 狀態改由 isScreenSharing / isScreenSharingPublisher 判斷。型別保留 optional 僅 為 macOS 未實作等防禦路徑。
Discussion
與 setCamera / setMicrophone 同一家族 —— 純硬體開關、回 track、 publish 分開。上層要送給誰,自行呼 publish(videoTrack:to:)。
原本 setScreenShare(true) 會偷偷對 Room 全員 publish,兩個問題:P2P 下追不上動態成員 (發完後才加入的人漏發),且會撞 publish 的單流名額 guard(該好友已有 video publish → throw)。
依 ScreenShareCaptureOptions.defaultToBroadcastExtension 自動偵測: 配了 Broadcast Extension → Broadcast 模式(可分享任何 App);否則 In-app 模式(只截 App 內)。
enabled = true:Broadcast 模式:彈系統 picker,並立即回傳軌道(第一階段,capturer 尚未啟動); 使用者選 Extension 按開始後,由 broadcast observation 自動觸發第二階段啟動 capturer
In-app 模式:等
RPScreenRecorder啟動完成才回傳(可能 throw 權限錯誤)
enabled = false:停 capturer;既有 screenShare publication 保留,出口改送佔位畫面 (不撤下發布;要撤下請呼叫unpublish(publication:))
Note
保留
async throws—— ReplayKit(RPScreenRecorder.startCapture)啟動需 await 且可能拋權限錯,與setCamera的 AVCaptureSession 不同。