React-Native Expo로 위치정보 받아오기

2024. 11. 10. 18:11·Stack/React-Native
반응형

React-Native에서 위치에 관한 기능을 사용하기 위해 Expo를 사용해보자

https://docs.expo.dev/versions/latest/sdk/location/

위의 docs 주소 참고하자

expo-location 설치

npx expo install expo-location

우선 expo-location 을 설치해주자

Location import 시키기

import * as Location from 'expo-location';

핸드폰으로 부터 허가 받기

전체 코드는 아래와 같다.

useEffect(() => {
    LocationFunc();
}, []);

const LocationFunc = async () => {

    // 1. requestForegroundPermissionsAsync() 허가 받는 함수
  const { granted } = await Location.requestForegroundPermissionsAsync();
  if (!granted) {
    setOk(false);
  }
  // 2. 위치정보 가지고 오기
  const loaction = await Location.getCurrentPositionAsync({ accuracy: 5 });
  console.log(loaction);
  // {
  //   "coords":
  //       {
  //         "accuracy": 5,
  //         "altitude": 0,
  //         "altitudeAccuracy": -1,
  //         "heading": -1,
  //         "latitude": 37.785834,
  //         "longitude": -122.406417,
  //         "speed": -1
  //       },
  //     "timestamp": 1730456103939.91
  // }

  const {
    coords: { latitude, longitude },
  } = await Location.getCurrentPositionAsync({ accuracy: 5 });

  // 3. 위치정보를 가지고 구글 맵스를 이용하여 정보 다시 가지고 오기
  const location = await Location.reverseGeocodeAsync({ latitude, longitude }, { useGoogleMaps: false });
  console.log(location);

  // [
  //   {
  //     city: '샌프란시스코',
  //     country: '미 합중국',
  //     district: 'Union Square',
  //     isoCountryCode: 'US',
  //     name: 'Powell St',
  //     postalCode: '94108',
  //     region: 'CA',
  //     street: 'Ellis St',
  //     streetNumber: '2–16',
  //     subregion: '샌프란시스코',
  //     timezone: 'America/Los_Angeles',
  //   },
  // ];
};

1. requestForegroundPermissionsAsync() 허가 받는 함수

// requestForegroundPermissionsAsync() 허가 받는 함수
const premission = await Location.requestForegroundPermissionsAsync();
console.log(permission);

 // {"canAskAgain": true, "expires": "never", "granted": true, "status": "granted"}

해당 값의 결과 값으로는 canAskAgain, expires, granted , status, 4가지가 있다.

  • canAskAgain : 사용자가 위치 권한 요청을 거부했더라도, 다시 위치 권한을 요청할 수 있다는 것을 의미한다. 결과값으로 boolean 타입을 갖는다.
  • expires : 권한의 만료 시간을 보여준다. 결과 값으로 아래의 값들을 가지고 있다.
    • "never": 권한이 만료되지 않음을 나타낸다.
    • 숫자: 권한이 만료되는 Unix 타임스탬프
    • "locked": 권한이 잠겨 있어 만료되지 않음을 나타낸다.
  • granted : 사용자가 앱에 위치 정보를 사용할 수 있는 권한을 부여했음 알 수 있다. 결과 값으로는 boolean 을 갖는다.
  • status : 사용자가 권한을 부여했는지 여부를 확인할 수 있다. 아래와 같은 결과 값을 가지고 있다
    • granted: 사용자가 위치 정보 접근 권한을 승인
    • denied: 사용자가 위치 정보 접근 권한을 거부
    • undetermined: 아직 사용자가 권한 요청을 처리하지 않음

코드를 좀더 간단히 처리하게 하려면 다음과 같다

  // 1. requestForegroundPermissionsAsync() 허가 받는 함수
  const { granted } = await Location.requestForegroundPermissionsAsync();
  if (!granted) {
    setOk(false);
  }

이렇게 작성하면 바로 grant 여부를 확인할 수 있는 코드로 줄일 수 있다.

2. 위치정보가지고오기

// 2. 위치정보 가지고 오기
  const loaction = await Location.getCurrentPositionAsync({ accuracy: 5 });
  console.log(loaction);
  // {
  //   "coords":
  //       {
  //         "accuracy": 5,
  //         "altitude": 0,
  //         "altitudeAccuracy": -1,
  //         "heading": -1,
  //         "latitude": 37.785834,
  //         "longitude": -122.406417,
  //         "speed": -1
  //       },
  //     "timestamp": 1730456103939.91
  // }

권한이 허용됬다면 다음과 같이 위치 정보 latitude, longitude 를 가지고 올 수 있다.

이를 이용해 코드를 조금 더 줄인 다면 다음과 같이 줄일 수 있다.

 const {
    coords: { latitude, longitude },
  } = await Location.getCurrentPositionAsync({ accuracy: 5 });

3. 위치정보를 가지고 구글 맵스를 이용하여 정보 다시 가지고 오기

 // 3. 위치정보를 가지고 구글 맵스를 이용하여 정보 다시 가지고 오기
  const location = await Location.reverseGeocodeAsync({ latitude, longitude }, { useGoogleMaps: false });
  console.log(location);

  // [
  //   {
  //     city: '샌프란시스코',
  //     country: '미 합중국',
  //     district: 'Union Square',
  //     isoCountryCode: 'US',
  //     name: 'Powell St',
  //     postalCode: '94108',
  //     region: 'CA',
  //     street: 'Ellis St',
  //     streetNumber: '2–16',
  //     subregion: '샌프란시스코',
  //     timezone: 'America/Los_Angeles',
  //   },
  // ];

가지고 온 latitude, longitude 를 가지고 reverseGeocodeAsync 를 이용하여 해당 정보를 받아온다.

반응형

'Stack > React-Native' 카테고리의 다른 글

React Native에서 환경 변수 안전하게 관리방법  (1) 2024.11.13
React-Native 사용팁들 (ios simulator 닫기, Expo 앱에서 Debugger 열기, custom location 설정)  (0) 2024.11.11
React-Native에 View 대해 알아보기  (1) 2024.10.31
React-Native의 간단한 구성  (1) 2024.10.31
React-native Expo로 시작  (0) 2024.08.21
'Stack/React-Native' 카테고리의 다른 글
  • React Native에서 환경 변수 안전하게 관리방법
  • React-Native 사용팁들 (ios simulator 닫기, Expo 앱에서 Debugger 열기, custom location 설정)
  • React-Native에 View 대해 알아보기
  • React-Native의 간단한 구성
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ios
    Python
    boj
    reactnative
    javascript
    Expo
    error
    알고리즘
    D2
    mongoDB Atlas
    프로그래머스
    react
    ReactHook
    react-native
    코테
    React-Native cli
    리액트네이티브
    Next.js
    hooks
    java
    티스토리챌린지
    백준
    react-native-maps
    오블완
    SWEA
    React Hooks
    mongodb cloud
    코테준비
    d1
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
React-Native Expo로 위치정보 받아오기
상단으로

티스토리툴바