Screen share in a 1-to-1 call
This page provides a code example for screen share in a 1-to-1 call.
Sender - Start sending screen share
The code implementation for starting screen share is as follows.
Collect the devices for screen capture and select one from them.
func collectCaptureDevices() -> [PlanetKitScreenCaptureDevice] {
var captureDevices = [PlanetKitScreenCaptureDevice]()
autoreleasepool {
for display in PlanetKitScreen.shared.displays {
let name: String
if let screen = NSScreen.screens.first(where: { $0.displayID == display.displayID }) {
name = screen.localizedName
}
...
captureDevices.append(PlanetKitScreenCaptureDevice(display: display))
}
let windows = PlanetKitScreen.shared.windows.filter {
$0.sharingType != .none &&
$0.alpha > 0 &&
$0.level == kCGNormalWindowLevel
}
let myAppId = Bundle.main.bundleIdentifier
for window in windows {
guard let image = window.image, window.sharingType != .none, window.bundleId != nil else {
continue
}
if myAppId == window.bundleId {
continue
}
...
captureDevices.append(PlanetKitScreenCaptureDevice(window: window))
}
}
return captureDevices
}
To start sending screen share, call startMyScreenShare()
.
func startMyScreenShare(_ device: PlanetKitScreenCaptureDevice) {
...
call.startMyScreenShare(device: device) { success in
guard success else { return }
// UI code here if success
}
}
Sender - Stop sending screen share
The code implementation for stopping screen share is as follows.
To stop screen share, call stopMyScreenShare().
call.stopMyScreenShare() { success in
self.delegate?.screenShare(self, willDismiss: dismiss)
}
Receiver - Receive screen share update events
Check whether a peer's screen share has started or stopped through the peerDidStartScreenShare
or peerDidStopScreenShare
event of PlanetKitCallDelegate
.
extension VideoCallViewController: PlanetKitCallDelegate {
...
func peerDidStartScreenShare(_ call: PlanetKitCall) {
NSLog("peer screen share started")
// UI code here
DispatchQueue.main.async {
self.setPeerScreenShareEnabled(true)
}
}
func peerDidStopScreenShare(_ call: PlanetKitCall, reason: Int32) {
NSLog("peer screen share stopped")
// UI code here
DispatchQueue.main.async {
self.setPeerScreenShareEnabled(false)
}
}
}
Receiver - Render a peer's screen share video
You can display the shared screen by adding a screen share view after the peerDidStartScreenShare
event occurs.
func setPeerScreenShareEnabled(_ enable: Bool) {
if enable {
let newView = PlanetKitMTKView(frame: view.bounds, device: nil)
view.addSubview(newView)
self.screenShareView = newView
call.addPeerScreenShareView(delegate: newView)
...
} else {
...
}
}
Receiver - Remove a peer's screen share video
If you do not wish to render the peer's shared screen, you can remove the screen share view from PlanetKitCall
.
func setPeerScreenShareEnabled(_ enable: Bool) {
if enable {
...
} else {
if let oldView = screenShareView {
oldView.removeFromSuperview()
screenShareView = nil
call.removePeerScreenShareView(delegate: oldView)
}
}
}