Мультиплатформенные пермиссии позволяют запрашивать разрешения с уровня 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 реализовать фукнцию получения нужной пермиссии.