Skip to main content

moko-permissions

Библиотека moko-permissions позволяет запрашивать runtime-разрешения в общем коде для iOS и Android.

Состав библиотеки

Библиотека состоит из базового модуля и набора модулей для конкретных разрешений:

  • permissions — базовый модуль с PermissionsController и Permission;
  • permissions-camera — разрешение Permission.CAMERA;
  • permissions-contactsPermission.CONTACTS;
  • permissions-galleryPermission.GALLERY;
  • permissions-locationPermission.LOCATION, COARSE_LOCATION, BACKGROUND_LOCATION;
  • permissions-microphonePermission.RECORD_AUDIO;
  • permissions-motionPermission.MOTION;
  • permissions-notificationsPermission.REMOTE_NOTIFICATION;
  • permissions-storagePermission.STORAGE, WRITE_STORAGE;
  • permissions-bluetoothPermission.BLUETOOTH_LE, BLUETOOTH_SCAN, BLUETOOTH_CONNECT, BLUETOOTH_ADVERTISE;
  • permissions-compose — интеграция с Compose Multiplatform;
  • permissions-test — вспомогательные утилиты для тестирования.

Использование

Общий код

class ViewModel(val permissionsController: PermissionsController) : ViewModel() {
fun onPhotoPressed() {
viewModelScope.launch {
try {
permissionsController.providePermission(Permission.GALLERY)
// разрешение получено
} catch (deniedAlways: DeniedAlwaysException) {
// разрешение запрещено навсегда — только настройки
} catch (denied: DeniedException) {
// разрешение запрещено в текущей сессии
}
}
}
}

Android

val viewModel = ViewModel(PermissionsController())
viewModel.permissionsController.bind(activity)

iOS

let viewModel = ViewModel(permissionsController: PermissionsController())

Compose Multiplatform

@Composable
fun Sample() {
val factory: PermissionsControllerFactory = rememberPermissionsControllerFactory()
val controller: PermissionsController = remember(factory) {
factory.createPermissionsController()
}
val coroutineScope = rememberCoroutineScope()

Button(onClick = {
coroutineScope.launch {
controller.providePermission(Permission.REMOTE_NOTIFICATION)
}
}) {
Text("give permissions")
}
}

Denied и DeniedAlways

Результат запроса разрешения может быть:

  • Granted — разрешение получено;
  • Denied — в текущей сессии не получено, можно запросить повторно. При повторном отказе переходит в DeniedAlways;
  • DeniedAlways — разрешение запрещено для приложения, системный диалог больше не показывается. Переход в Granted возможен только через настройки приложения.

На iOS состояния только granted и always denied (аналог DeniedAlways).

Дополнительные материалы