shepeliev / webrtc-kmp

WebRTC Kotlin Multiplatform SDK
Apache License 2.0
169 stars 34 forks source link

WebRTC KMP Maven Central

WebRTC Kotlin Multiplatform SDK is a comprehensive toolkit for integrating WebRTC functionality into your multiplatform projects. It supports Android, iOS, JS. Other platforms - PRs are welcome.

API implementation map

API Android iOS JS/WasmJS
Audio/Video :white_check_mark: :white_check_mark: :white_check_mark:
Data channel :white_check_mark: :white_check_mark: :white_check_mark:
Screen Capture :white_check_mark: :white_check_mark:

WebRTC revision

Current revision: M125

Installation

The library is published to Maven Central.

Shared module build.gradle.kts

kotlin {
  cocoapods {
    version = "1.0.0"
    summary = "Shared module"
    homepage = "not published"
    ios.deploymentTarget = "11.0"

    pod("WebRTC-SDK") {
      version = "125.6422.02"
      linkOnly = true
    }

    podfile = project.file("../iosApp/Podfile")

    framework {
      baseName = "shared"
      export("com.shepeliev:webrtc-kmp:$webRtcKmpVersion")
      transitiveExport = true
    }

    xcodeConfigurationToNativeBuildType["CUSTOM_DEBUG"] = NativeBuildType.DEBUG
    xcodeConfigurationToNativeBuildType["CUSTOM_RELEASE"] = NativeBuildType.RELEASE
  }

  android()

  ios()
  iosSimulatorArm64()

  js {
   useCommonJs()
   browser()
  }

  sourceSets {
      val commonMain by getting {
          dependencies {
              api("com.shepeliev:webrtc-kmp:$webRtcKmpVersion")
          }
      }

      val iosMain by getting
      val iosSimulatorArm64Main by getting
      iosSimulatorArm64Main.dependsOn(iosMain)
  }
}

Also add the following to your Podfile in the target section:

use_frameworks!
pod 'shared', :path => '../shared'

Usage

Please refer to sample.

Screen Share in Android

// Set MediaProjection permission intent using `MediaProjectionIntentHolder`
val mediaProjectionPermissionLauncher = rememberLauncherForActivityResult(
    contract = ActivityResultContracts.StartActivityForResult()
) { activityResult ->
    activityResult.data?.also {
        MediaProjectionIntentHolder.intent = it
    }
}