Bandwidth WebRTC Swift is an open-source implementation of Bandwidth WebRTC suitable for iOS devices.
In order to take advantage of this package a Bandwidth account with WebRTC Audio and/or Video must be enabled.
import WebRTC
import BandwidthWebRTC
class WebRTCService {
    let bandwidth = RTCBandwidth()
    
    var localVideoTrack: RTCVideoTrack?
    var localCameraVideoCapturer: RTCCameraVideoCapturer?
    var remoteVideoTrack: RTCVideoTrack?
    init() {
        bandwidth.delegate = self
        getToken { token in
            try? self.bandwidth.connect(using: token) {
                self.bandwidth.publish(alias: "Bolg") { stream in
                    self.localVideoTrack = stream.mediaStream.track as? RTCVideoTrack
                    // localRenderer should be a UIView of type RTCVideoRenderer. This is the view which displays the local video.
                    self.localVideoTrack?.add(self.localRenderer)
                    self.localCameraVideoCapturer = RTCCameraVideoCapturer()
                    self.localCameraVideoCapturer?.delegate = self.localVideoTrack?.source
                    // Grab the front facing camera. TODO: Add support for additional cameras.
                    guard let device = RTCCameraVideoCapturer.captureDevices().first(where: { $0.position == .front }) else {
                        return
                    }
                    
                    // Grab the highest resolution available.
                    guard let format = RTCCameraVideoCapturer.supportedFormats(for: device)
                        .sorted(by: { CMVideoFormatDescriptionGetDimensions($0.formatDescription).width < CMVideoFormatDescriptionGetDimensions($1.formatDescription).width })
                        .last else {
                        return
                    }
                    
                    // Grab the highest fps available.
                    guard let fps = format.videoSupportedFrameRateRanges
                        .compactMap({ $0.maxFrameRate })
                        .sorted()
                        .last else {
                        return
                    }
                    
                    // Start capturing local video with the given parameters.
                    self.localCameraVideoCapturer?.startCapture(with: device, format: format, fps: Int(fps))
                }
            }
        }
    }
    func getToken(completion: @escaping (String) -> Void) {
        // Return a Bandwidth WebRTC participant token from your application server. https://dev.bandwidth.com/webrtc/methods/participants/createParticipant.html
    }
}
extension WebRTCService: RTCBandwidthDelegate {
    func bandwidth(_ bandwidth: RTCBandwidth, streamAvailable stream: RTCStream) {
        if let remoteVideoTrack = stream.mediaStream.track as? RTCVideoTrack {
            self.remoteVideoTrack = remoteVideoTrack
            
            DispatchQueue.main.async {
                // remoteRenderer should be a UIView of type RTCVideoRenderer. This is the view which displays the remote video.
                self.remoteVideoTrack?.add(self.remoteRenderer)
            }
        }
    }
    func bandwidth(_ bandwidth: RTCBandwidth, streamUnavailable stream: RTCStream) {
        
    }
}A number of samples using Bandwidth WebRTC Swift may be found within Bandwidth-Samples.
Bandwidth WebRTC Swift follows SemVer 2.0.0.