/moko-permissions

Runtime permissions controls for mobile (android & ios) Kotlin Multiplatform development

Primary LanguageKotlinApache License 2.0Apache-2.0

GitHub license Download

Базовые компоненты для мультиплатформы

Permissions

Мультиплатформенные пермиссии позволяют запрашивать разрешения с уровня viewModel с использованием coroutines. Выглядит это следующим образом:

class ViewModel(val permissionsController: PermissionsController): ViewModel() {
    fun onPhotoPressed() {
        launch {
            try {
                permissionsController.providePermission(Permission.GALLERY)
                // при выполнении кода дальше мы можем быть уверены что разрешение выдано.
            } catch(error: Throwable) {
                // ошибка может быть платформенная (отказ от выдачи разрешения, отказ навсегда)
            }
        }
    }
}

На android контроллер использует retain фрагмент для сохранения continuation при смене конфигурации, но после уничтожения приложения системой из-за нехватки памяти - после выдачи разрешения код в корутине не выполнится (корутины в этом случае уже не будет запущенной).
На iOS никаких заморочек с жизненным циклом и так нет, так что узких мест в реализации нет.

Создается контроллер следующим образом:
android:

val viewModel = getViewModel {
    ViewModel(PermissionsController())
}

viewModel.permissionsController.bind(lifecycle, supportFragmentManager)

iOS:

let viewModel = ViewModel(permissionsController: PermissionsController())

Для добавления новых пермиссий требуется изменение только в kotlin коде:

  • в enum Permission добавить новую пермиссию;
  • в android sourceSet в PermissionsController прописать маппинг пермиссии в платформенную;
  • в ios sourceSet в PermissionsController реализовать фукнцию получения нужной пермиссии.