Skip to main content

expo-location

Version: 55.0.7 Allows reading geolocation information from the device. Your app can poll for the current location or subscribe to location update events.

Installation

npx expo install expo-location

Usage

import * as Location from 'expo-location';

// Request permissions
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') {
  return;
}

// Get current location
const location = await Location.getCurrentPositionAsync({});
console.log(location.coords.latitude, location.coords.longitude);

// Watch location
const subscription = await Location.watchPositionAsync(
  {
    accuracy: Location.Accuracy.High,
    distanceInterval: 10,
  },
  (location) => {
    console.log('Location update:', location.coords);
  }
);

API Reference

Permissions

requestForegroundPermissionsAsync()
() => Promise<LocationPermissionResponse>
Requests foreground location permissions
requestBackgroundPermissionsAsync()
() => Promise<LocationPermissionResponse>
Requests background location permissions

Get Location

getCurrentPositionAsync(options)
(options?: LocationOptions) => Promise<LocationObject>
Gets current position
const location = await Location.getCurrentPositionAsync({
  accuracy: Location.Accuracy.Balanced,
});
getLastKnownPositionAsync(options)
(options?: LastKnownPositionOptions) => Promise<LocationObject | null>
Gets last known position
watchPositionAsync(options, callback)
(options: LocationOptions, callback: LocationCallback) => Promise<LocationSubscription>
Watches position changes
const sub = await Location.watchPositionAsync(
  { accuracy: Location.Accuracy.High },
  (loc) => console.log(loc)
);

// Later: sub.remove();

Geocoding

geocodeAsync(address)
(address: string) => Promise<LocationGeocodedAddress[]>
Converts address to coordinates
const results = await Location.geocodeAsync('1 Infinite Loop, Cupertino');
console.log(results[0].latitude, results[0].longitude);
reverseGeocodeAsync(location)
(location: LocationGeocodedLocation) => Promise<LocationGeocodedAddress[]>
Converts coordinates to address
const addresses = await Location.reverseGeocodeAsync({
  latitude: 37.33,
  longitude: -122.03,
});
console.log(addresses[0].city, addresses[0].street);

Examples

Get Current Location

import * as Location from 'expo-location';

async function getCurrentLocation() {
  const { status } = await Location.requestForegroundPermissionsAsync();
  
  if (status !== 'granted') {
    alert('Permission denied');
    return;
  }

  const location = await Location.getCurrentPositionAsync({
    accuracy: Location.Accuracy.High,
  });

  console.log('Current location:', {
    latitude: location.coords.latitude,
    longitude: location.coords.longitude,
    accuracy: location.coords.accuracy,
  });
}

Track User Location

import * as Location from 'expo-location';
import { useState, useEffect } from 'react';
import { View, Text } from 'react-native';

export default function LocationTracker() {
  const [location, setLocation] = useState<Location.LocationObject | null>(null);

  useEffect(() => {
    let subscription: Location.LocationSubscription;

    async function startTracking() {
      const { status } = await Location.requestForegroundPermissionsAsync();
      if (status !== 'granted') return;

      subscription = await Location.watchPositionAsync(
        {
          accuracy: Location.Accuracy.Balanced,
          distanceInterval: 10,
        },
        (newLocation) => {
          setLocation(newLocation);
        }
      );
    }

    startTracking();

    return () => {
      subscription?.remove();
    };
  }, []);

  if (!location) {
    return <Text>Getting location...</Text>;
  }

  return (
    <View>
      <Text>Latitude: {location.coords.latitude}</Text>
      <Text>Longitude: {location.coords.longitude}</Text>
      <Text>Accuracy: {location.coords.accuracy}m</Text>
    </View>
  );
}

Platform Support

PlatformSupported
iOS
Android
Web

Permissions

iOS: Add to app.json:
{
  "ios": {
    "infoPlist": {
      "NSLocationWhenInUseUsageDescription": "Allow app to use location",
      "NSLocationAlwaysAndWhenInUseUsageDescription": "Allow app to use location"
    }
  }
}
Android: Permissions automatically added.

Resources

Build docs developers (and LLMs) love