moko-permissions
Библиотека moko-permissions позволяет запрашивать runtime-разрешения в общем коде для iOS и Android.
Состав библиотеки
Библиотека состоит из базового модуля и набора модулей для конкретных разрешений:
permissions— базовый модуль сPermissionsControllerиPermission;permissions-camera— разрешениеPermission.CAMERA;permissions-contacts—Permission.CONTACTS;permissions-gallery—Permission.GALLERY;permissions-location—Permission.LOCATION,COARSE_LOCATION,BACKGROUND_LOCATION;permissions-microphone—Permission.RECORD_AUDIO;permissions-motion—Permission.MOTION;permissions-notifications—Permission.REMOTE_NOTIFICATION;permissions-storage—Permission.STORAGE,WRITE_STORAGE;permissions-bluetooth—Permission.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).