Разрешения и API устройства через Expo
Разбираемся, как приложение получает доступ к «железу» телефона и почему сначала нужно спросить разрешение.
Разрешение (permission) — согласие пользователя на доступ к чувствительной возможности: камере, геолокации, уведомлениям. Без него ОС не даст доступ.
Почему нужны разрешения
Камера, микрофон, геолокация, контакты — это личные данные. ОС защищает пользователя: приложение не может молча включить камеру. Сначала оно обязано спросить, и пользователь видит системное окно «Разрешить доступ?». Если откажет — функция недоступна, и приложение должно это корректно пережить.
Модули Expo
Expo даёт готовые модули для возможностей устройства — не нужно писать нативный код. Каждый ставится отдельно.
| Возможность | Модуль Expo |
| Камера | expo-camera |
| Геолокация | expo-location |
| Уведомления | expo-notifications |
| Выбор фото | expo-image-picker |
Установка модуля:
npx expo install expo-location
Команда expo install (а не просто npm install) подбирает версию, совместимую с вашим Expo SDK.
Типичный шаблон запроса
Почти все модули устроены одинаково: есть функция-хук, которая возвращает текущий статус разрешения и функцию для запроса. Сначала проверяем, есть ли доступ; если нет — просим.
import { useCameraPermissions } from "expo-camera";
import { View, Text, Button } from "react-native";
function CameraGate() {
const [permission, requestPermission] = useCameraPermissions();
if (!permission) {
return <Text>Проверяем разрешение...</Text>;
}
if (!permission.granted) {
return (
<View>
<Text>Нужен доступ к камере</Text>
<Button title="Разрешить" onPress={requestPermission} />
</View>
);
}
return <Text>Доступ к камере есть!</Text>;
}
Тут три состояния: разрешение ещё не известно, в доступе отказано (просим), доступ есть. Хорошее приложение аккуратно обрабатывает все три.
Три состояния разрешения
- не определено — ещё не спрашивали;
- granted — пользователь разрешил;
- denied — отказал, нужно объяснить, зачем доступ, или предложить открыть настройки.
Проверка статуса — обычный JS
Логика реакции на статус — обычный JavaScript. Запускаемый пример:
function describe(permission) {
if (!permission) return "Статус ещё не известен";
if (permission.granted) return "Доступ разрешён";
return "Доступ запрещён";
}
console.log(describe(null));
console.log(describe({ granted: true }));
console.log(describe({ granted: false }));
Вывод:
Статус ещё не известен Доступ разрешён Доступ запрещён
Итог
- Доступ к чувствительным возможностям требует разрешения пользователя.
- Expo даёт готовые модули (
expo-camera,expo-locationи др.), ставят их черезnpx expo install. - Всегда обрабатывайте три состояния: неизвестно, разрешено, отказано.