
Facilitates permission requests across Android and iOS environments, supporting a variety of permissions like location and camera, with easy setup and integration in multiplatform projects.
kPermissions is a Kotlin Multiplatform library that helps you manage runtime permissions on Android and iOS, with full modularity and optional support for Jetpack Compose Multiplatform (CMP).
expect/actual API structurecommonMain
| Module | Purpose |
|---|---|
kpermissions-api |
Shared interface definitions like Permission, PermissionStatus, etc. |
kpermissions-core |
Compose UI support β automatically included in permission modules |
kpermissions-gallery, kpermissions-record-audio, etc. |
Ready-to-use permission modules for different needs |
dependencies {
implementation("io.github.kpermissions:kpermissions-gallery:<version>")
// Add more as needed
}but need add it as api and all permissions for export it if u need use native ui
val permission = rememberPermissionState(GalleryPermission)
LaunchedEffect(Unit) { permission.launchPermissionRequest { granted -> if (granted) { // β Permission granted } else { // β Permission denied } } }
import io.github.kPermissions_api.Permission
expect object RecordAudioPermission : Permission// androidMain/kotlin/RecordAudioPermission.android.kt
import android.Manifest
import io.github.kPermissions_api.Permission
actual object RecordAudioPermission : Permission {
override val name: String = "record_audio"
override val androidPermissionName: String = Manifest.permission.RECORD_AUDIO
}// iosMain/kotlin/RecordAudioPermission.ios.kt
import io.github.kPermissions_api.Permission
import io.github.kPermissions_api.PermissionStatus
import platform.AVFoundation.*
private fun getRecordAudioPermissionStatus(): PermissionStatus {
return when (AVAudioSession.sharedInstance().recordPermission) {
AVAudioSessionRecordPermissionGranted -> PermissionStatus.Granted
AVAudioSessionRecordPermissionDenied -> PermissionStatus.DeniedPermanently
AVAudioSessionRecordPermissionUndetermined -> PermissionStatus.Denied
else -> PermissionStatus.Denied
}
}
internal fun requestRecordAudioPermission(): ((Boolean) -> Unit) -> Unit {
return { callback ->
AVAudioSession.sharedInstance().requestRecordPermission { granted ->
callback(granted)
}
}
}
actual object RecordAudioPermission : Permission {
override val name: String = "record_audio"
override val permissionRequest: ((Boolean) -> Unit) -> Unit
get() = requestRecordAudioPermission()
override fun getPermissionStatus(): PermissionStatus = getRecordAudioPermissionStatus()
}
π Notes kpermissions-core is already included via api(...) in all official permissions β no need to add it manually.
@Composable
fun rememberPermissionState(
permission: Permission,
onPermissionResult: (Boolean) -> Unit,
): PermissionState
@Composable
fun rememberMultiplePermissionsState(
permissions: List<Permission>,
onPermissionsResult: (Boolean) -> Unit,
): List<PermissionState>
Interface: PermissionStateinterface PermissionState {
val permission: Permission
var status: PermissionStatus
fun launchPermissionRequest()
fun openAppSettings()
}To enable additional control like SDK version limits or platform ignoring for permissions in Compose Multiplatform, you can include the kpermissions-cmp module:
implementation("io.github.kpermissions:kpermissions-cmp:<version>")This module allows you to:
minSdkVersion / maxSdkVersion for each platformPlatformIgnore to skip permissions on specific platforms (e.g. iOS-only or Android-only)MIT License
We welcome contributions and suggestions! Feel free to open issues or pull requests for bug fixes, enhancements, or new permission types.
kPermissions is a Kotlin Multiplatform library that helps you manage runtime permissions on Android and iOS, with full modularity and optional support for Jetpack Compose Multiplatform (CMP).
expect/actual API structurecommonMain
| Module | Purpose |
|---|---|
kpermissions-api |
Shared interface definitions like Permission, PermissionStatus, etc. |
kpermissions-core |
Compose UI support β automatically included in permission modules |
kpermissions-gallery, kpermissions-record-audio, etc. |
Ready-to-use permission modules for different needs |
dependencies {
implementation("io.github.kpermissions:kpermissions-gallery:<version>")
// Add more as needed
}but need add it as api and all permissions for export it if u need use native ui
val permission = rememberPermissionState(GalleryPermission)
LaunchedEffect(Unit) { permission.launchPermissionRequest { granted -> if (granted) { // β Permission granted } else { // β Permission denied } } }
import io.github.kPermissions_api.Permission
expect object RecordAudioPermission : Permission// androidMain/kotlin/RecordAudioPermission.android.kt
import android.Manifest
import io.github.kPermissions_api.Permission
actual object RecordAudioPermission : Permission {
override val name: String = "record_audio"
override val androidPermissionName: String = Manifest.permission.RECORD_AUDIO
}// iosMain/kotlin/RecordAudioPermission.ios.kt
import io.github.kPermissions_api.Permission
import io.github.kPermissions_api.PermissionStatus
import platform.AVFoundation.*
private fun getRecordAudioPermissionStatus(): PermissionStatus {
return when (AVAudioSession.sharedInstance().recordPermission) {
AVAudioSessionRecordPermissionGranted -> PermissionStatus.Granted
AVAudioSessionRecordPermissionDenied -> PermissionStatus.DeniedPermanently
AVAudioSessionRecordPermissionUndetermined -> PermissionStatus.Denied
else -> PermissionStatus.Denied
}
}
internal fun requestRecordAudioPermission(): ((Boolean) -> Unit) -> Unit {
return { callback ->
AVAudioSession.sharedInstance().requestRecordPermission { granted ->
callback(granted)
}
}
}
actual object RecordAudioPermission : Permission {
override val name: String = "record_audio"
override val permissionRequest: ((Boolean) -> Unit) -> Unit
get() = requestRecordAudioPermission()
override fun getPermissionStatus(): PermissionStatus = getRecordAudioPermissionStatus()
}
π Notes kpermissions-core is already included via api(...) in all official permissions β no need to add it manually.
@Composable
fun rememberPermissionState(
permission: Permission,
onPermissionResult: (Boolean) -> Unit,
): PermissionState
@Composable
fun rememberMultiplePermissionsState(
permissions: List<Permission>,
onPermissionsResult: (Boolean) -> Unit,
): List<PermissionState>
Interface: PermissionStateinterface PermissionState {
val permission: Permission
var status: PermissionStatus
fun launchPermissionRequest()
fun openAppSettings()
}To enable additional control like SDK version limits or platform ignoring for permissions in Compose Multiplatform, you can include the kpermissions-cmp module:
implementation("io.github.kpermissions:kpermissions-cmp:<version>")This module allows you to:
minSdkVersion / maxSdkVersion for each platformPlatformIgnore to skip permissions on specific platforms (e.g. iOS-only or Android-only)MIT License
We welcome contributions and suggestions! Feel free to open issues or pull requests for bug fixes, enhancements, or new permission types.