내맘대로 개발일지

[RN] 권한받아오기 - 카메라 / 갤러리 / 위치 / 연락처 본문

Javascript/React-Native

[RN] 권한받아오기 - 카메라 / 갤러리 / 위치 / 연락처

eulBlue 2025. 6. 16. 17:12

📱테스트 환경

"react": "19.0.0",
"react-native": "0.79.2"

앱을 만들면 당연히 권한이 필요한 경우가 찾아온다.

퍼미션 등록이나 인포등록은 간단하니 해당 내용은 스킵하고

JS 코드만 정리하도록 하겠다.

// 카메라

export const camera = async () => {
  let permission;

  if (Platform.OS === 'android') {
    permission = PERMISSIONS.ANDROID.CAMERA;
  } else if (Platform.OS === 'ios') {
    permission = PERMISSIONS.IOS.CAMERA;
  } else {
    return;
  }

  const status = await check(permission);

  switch (status) {
    case RESULTS.UNAVAILABLE:
      console.log('이 기기에서는 카메라를 사용할 수 없습니다.');
      return;

    case RESULTS.DENIED:
      console.log('권한이 거부되었으나 요청이 가능합니다.');
      const newStatus = await request(permission);
      if (newStatus === RESULTS.GRANTED) {
        console.log('카메라 권한이 허용되었습니다.');
      } else {
        console.log('카메라 권한 필요', '설정에서 권한을 활성화해주세요.');
      }
      return;

    case RESULTS.BLOCKED:
      console.log('권한이 차단되었고, 요청할 수 없습니다.');
      Alert.alert(
        '카메라 권한 필요',
        '설정에서 카메라 권한을 허용해야 합니다.',
        [
          {text: '설정으로 이동', onPress: () => Linking.openSettings()},
          {text: '취소', style: 'cancel'},
        ],
      );
      return;

    case RESULTS.GRANTED:
      console.log('카메라 권한이 이미 허용되었습니다.');
      return;

    case RESULTS.LIMITED:
      console.log('카메라 권한이 제한적으로 허용되었습니다.');
      return;
  }
};
// 연락처

export const contacts = async () => {
  let permission;

  if (Platform.OS === 'android') {
    permission = PERMISSIONS.ANDROID.READ_CONTACTS;
  } else if (Platform.OS === 'ios') {
    permission = PERMISSIONS.IOS.CONTACTS;
  } else {
    console.log('지원되지 않는 플랫폼');
    return;
  }

  const status = await check(permission);

  switch (status) {
    case RESULTS.UNAVAILABLE:
      console.log('이 기기에서는 연락처 서비스를 사용할 수 없습니다.');
      return;

    case RESULTS.DENIED:
      console.log('권한이 거부되었으나 요청이 가능합니다.');
      const newStatus = await request(permission);
      if (newStatus === RESULTS.GRANTED) {
        console.log('연락처 접근 권한이 허용되었습니다.');
      } else {
        console.log('연락처 접근 권한 필요: 설정에서 권한을 활성화해주세요.');
      }
      return;

    case RESULTS.BLOCKED:
      console.log('권한이 차단되었고, 요청할 수 없습니다.');
      Alert.alert(
        '연락처 접근 권한 필요',
        '설정에서 연락처 권한을 허용해야 합니다.',
        [
          {text: '설정으로 이동', onPress: () => Linking.openSettings()},
          {text: '취소', style: 'cancel'},
        ],
      );
      return;

    case RESULTS.GRANTED:
      console.log('연락처 접근 권한이 이미 허용되었습니다.');
      return;

    case RESULTS.LIMITED:
      console.log('연락처 접근 권한이 제한적으로 허용되었습니다.');
      return;
  }
};
// 갤러리

export const gallery = async () => {
  let permission;

  if (Platform.OS === 'android') {
    permission = PERMISSIONS.ANDROID.READ_MEDIA_IMAGES; // Android 13(API 33) 이상
  } else if (Platform.OS === 'ios') {
    permission = PERMISSIONS.IOS.PHOTO_LIBRARY;
  } else {
    console.log('지원되지 않는 플랫폼');
    return;
  }

  const status = await check(permission);

  switch (status) {
    case RESULTS.UNAVAILABLE:
      console.log('이 기기에서는 갤러리를 사용할 수 없습니다.');
      return;

    case RESULTS.DENIED:
      console.log('권한이 거부되었으나 요청이 가능합니다.');
      const newStatus = await request(permission);
      if (newStatus === RESULTS.GRANTED) {
        console.log('갤러리 접근 권한이 허용되었습니다.');
      } else {
        console.log('갤러리 접근 권한 필요: 설정에서 권한을 활성화해주세요.');
      }
      return;

    case RESULTS.BLOCKED:
      console.log('권한이 차단되었고, 요청할 수 없습니다.');
      Alert.alert(
        '갤러리 접근 권한 필요',
        '설정에서 갤러리 권한을 허용해야 합니다.',
        [
          {text: '설정으로 이동', onPress: () => Linking.openSettings()},
          {text: '취소', style: 'cancel'},
        ],
      );
      return;

    case RESULTS.GRANTED:
      console.log('갤러리 접근 권한이 이미 허용되었습니다.');
      return;

    case RESULTS.LIMITED:
      console.log('갤러리 접근 권한이 제한적으로 허용되었습니다.');
      return;
  }
};
// 현재위치

export const location = async (): Promise<boolean> => {
  let permission;

  if (Platform.OS === 'android') {
    permission = PERMISSIONS.ANDROID.ACCESS_FINE_LOCATION;
  } else if (Platform.OS === 'ios') {
    permission = PERMISSIONS.IOS.LOCATION_WHEN_IN_USE;
  } else {
    console.log('지원되지 않는 플랫폼');
    return true;
  }

  const status = await check(permission);

  switch (status) {
    case RESULTS.UNAVAILABLE:
      console.log('이 기기에서는 위치 서비스를 사용할 수 없습니다.');
      return true;

    case RESULTS.DENIED:
      console.log('권한이 거부되었으나 요청이 가능합니다.');
      const newStatus = await request(permission);
      if (newStatus === RESULTS.GRANTED) {
        console.log('위치 권한이 허용되었습니다.');
      } else {
        console.log('위치 권한 필요', '설정에서 권한을 활성화해주세요.');
      }
      return false;

    case RESULTS.BLOCKED:
      console.log('권한이 차단되었고, 요청할 수 없습니다.');
      Alert.alert('위치 권한 필요', '설정에서 위치 권한을 허용해야 합니다.', [
        {text: '설정으로 이동', onPress: () => Linking.openSettings()},
        {text: '취소', style: 'cancel'},
      ]);
      return false;

    case RESULTS.GRANTED:
      console.log('위치 권한이 이미 허용되었습니다.');
      return true;

    case RESULTS.LIMITED:
      console.log('위치 권한이 제한적으로 허용되었습니다.');
      return false;
  }
};