Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Геолокация

Геолокация — определение местоположения телефона по 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": "Город нужен, чтобы показывать местные новости." }]
    ]
  }
}

Понятное объяснение повышает шанс, что пользователь нажмёт «Разрешить».

Частая ошибка

Запрашивать разрешение сразу при запуске приложения. Пользователь ещё не понимает, зачем оно нужно, и часто отказывает, а повторно система окно не покажет — включить доступ можно будет только в настройках телефона. Спрашивайте в момент, когда человек сам нажал кнопку, связанную с геолокацией.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.