Swift

Integrate with Vonage Video Manager

In your VonageVideoManager.swift, create an instance of the custom renderer and assign it to the publisher:

import OpenTok
import SwiftUI

final class VonageVideoManager: NSObject, ObservableObject {
    let kAppId = "YOUR_APP_ID"
    let kSessionId = "YOUR_SESSION_ID"
    let kToken = "YOUR_TOKEN"
    
    // Create the custom renderer instance
    let renderer = CustomVideoRender()
    
    private lazy var publisher: OTPublisher? = {
        let settings = OTPublisherSettings()
        settings.name = UIDevice.current.name
        return OTPublisher(delegate: self, settings: settings)
    }()
    
    @Published var pubView: AnyView?
    
    private func doPublish() {
        var error: OTError?
        defer {
            processError(error)
        }
        
        // Assign the custom renderer to the publisher
        guard let publisher else { return }
        publisher.videoRender = renderer
        session?.publish(publisher, error: &error)
        
        // Setup view hierarchy
        guard let pubView = publisher.view else { return }
        
        pubView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
        renderer.view.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
        pubView.addSubview(renderer.view)
        
        // Wrap UIView for SwiftUI
        DispatchQueue.main.async {
            self.pubView = AnyView(Wrap(pubView))
        }
    }
}

Key Points:

  • Create a single instance of CustomVideoRender (reuse it, don't create multiple instances)
  • Assign it to publisher.videoRender before publishing
  • Add the renderer's view as a subview of the publisher's view
  • Use a Wrap helper to display UIView in SwiftUI