Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- Android
- Next
- 티스토리챌린지
- AWS
- nginx
- spring boots
- it
- EC2
- Jenkins
- 오퍼월
- chrome
- 오블완
- python
- react-native
- React
- css
- 백준
- TypeScript
- JavaScript
- 광고 id
- toml
- kotlin
- Express
- NanoHttpd
- docker
- nuxt
- 코딩테스트
- 개발
- 코테
- 파이썬
Archives
- Today
- Total
내맘대로 개발일지
[RN] 권한받아오기 - 카메라 / 갤러리 / 위치 / 연락처 본문
📱테스트 환경
"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;
}
};'Javascript > React-Native' 카테고리의 다른 글
| [RN] Storybook 연결하기 (0) | 2025.07.09 |
|---|---|
| [RN] gorhom 바텀시트 사용하기 (1) | 2025.06.23 |
| [RN] i18next react-i18next 사용하는 방법 (0) | 2025.06.16 |
| [RN] react native - fontSize / width / height 반응형 (0) | 2025.06.16 |
| [RN] react-native-web 사용 후기 나는 비추 (0) | 2025.04.17 |