Разрешения и 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.
  • Всегда обрабатывайте три состояния: неизвестно, разрешено, отказано.
Проверьте себя
1. Зачем приложению запрашивать разрешения?
AЧтобы ускорить загрузку
BОС защищает личные данные: без согласия пользователя доступ к камере, геолокации и т.п. закрыт
CЧтобы попасть в магазин приложений
DЭто нужно только на Android
2. Какой командой ставят Expo-модули вроде expo-location?
Anpm run install expo-location
Bnpx expo install expo-location
Cexpo add location
Dnode install expo-location
3. Какие три состояния разрешения важно обработать?
Aзагрузка, успех, кэш
Bне определено, разрешено (granted), отказано (denied)
Cвключено, выключено, спящее
Dновое, старое, удалённое
Поддержать проект