Геолокация
Геолокация — определение местоположения телефона по GPS, Wi-Fi и сотовым вышкам. Модуль expo-location возвращает координаты и умеет превращать их в адрес. Добавим в профиль блога строку «Ваш город».
Установка
npx expo install expo-locationМодуль входит в Expo Go и работает на телефоне, в эмуляторе и в браузере.
Разрешение и координаты
Местоположение — личные данные, поэтому сначала спрашивают разрешение, и только потом читают координаты:
// app/(tabs)/profile.tsx
import * as Location from 'expo-location';
import { useState } from 'react';
import { Button, Text, View } from 'react-native';
export default function Profile() {
const [message, setMessage] = useState('Город не определён');
async function detectLocation() {
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') {
setMessage('Нет доступа к геолокации');
return;
}
const position = await Location.getCurrentPositionAsync({});
const { latitude, longitude } = position.coords;
setMessage(`Координаты: ${latitude.toFixed(3)}, ${longitude.toFixed(3)}`);
}
return (
<View style={{ flex: 1, padding: 16, gap: 12 }}>
<Text>{message}</Text>
<Button title="Определить город" onPress={detectLocation} />
</View>
);
}При первом нажатии система покажет окно с вопросом о доступе к геопозиции. После разрешения через секунду-другую появятся координаты, например «Координаты: 52.520, 13.405». В эмуляторе координаты задаются в его настройках.
Из координат в город
reverseGeocodeAsync превращает координаты в адрес — массив вариантов с полями city, country, street и другими:
// app/(tabs)/profile.tsx
const [place] = await Location.reverseGeocodeAsync({ latitude, longitude });
setMessage(place?.city ? `Ваш город: ${place.city}` : 'Город не найден');Замените этими строками последнюю строку detectLocation. Теперь вместо чисел появится, например, «Ваш город: Berlin». Определение адреса работает на iOS и Android; в браузере проверяйте только координаты.
Виды разрешений
| Функция | Когда доступна геопозиция |
|---|---|
requestForegroundPermissionsAsync | Пока приложение открыто |
requestBackgroundPermissionsAsync | Даже в фоне, например для трекера пробежек |
Для блога достаточно первого. Фоновый доступ требует отдельной настройки и строго проверяется магазинами приложений.
Текст запроса
Как и у камеры, объяснение для пользователя задают в плагине в app.json:
{
"expo": {
"plugins": [
["expo-location", { "locationWhenInUsePermission": "Город нужен, чтобы показывать местные новости." }]
]
}
}Понятное объяснение повышает шанс, что пользователь нажмёт «Разрешить».
Частая ошибка
Запрашивать разрешение сразу при запуске приложения. Пользователь ещё не понимает, зачем оно нужно, и часто отказывает, а повторно система окно не покажет — включить доступ можно будет только в настройках телефона. Спрашивайте в момент, когда человек сам нажал кнопку, связанную с геолокацией.