본문 바로가기
React Native

[RN] 리액트 네이티브 카메라, 마이크 권한 얻기

by 붕어사랑 티스토리 2022. 11. 15.
반응형

1. 서론

웹뷰로 카메라 쓸 일이 생겼었다. 헌데 아이폰에서 리액트 네이티브 웹뷰를 올리니깐 카메라 권한 물어보는 리퀘스트가 뜨지를 않는다.

찾아보니 리액트네이티브에서는 자체적으로 권한요청을 제공하지 않고 react-native-permission이라는 라이브러리를 사용해야한다.

 

 

깃허브 주소는 아래를 참고

 

https://github.com/zoontek/react-native-permissions

 

GitHub - zoontek/react-native-permissions: An unified permissions API for React Native on iOS and Android

An unified permissions API for React Native on iOS and Android - GitHub - zoontek/react-native-permissions: An unified permissions API for React Native on iOS and Android

github.com

 

 

 

 

 

2. 설치 및 준비

아래 커맨드로 라이브러리를 설치해준다.

npm install --save react-native-permissions
또는
yarn add react-native-permissions

 

이후 권한을 얻을 파일에다가 아래처럼 임포트를 해준다.

import * as permissions from 'react-native-permissions';
// you may also import just the functions or constants that you will use from this library
import {request, PERMISSIONS} from 'react-native-permissions';

 

 

 

 

 

3. 권한의 얻기 in IOS

아래는 react-native-permission으로 요청할 수 있는 권한들의 목록이다.

여기서 원하는 권한을 고른뒤 Podfile에 추가 한 후 pod install을 해주면 된다.

target 'YourAwesomeProject' do

  # …

  permissions_path = '../node_modules/react-native-permissions/ios'

  pod 'Permission-AppTrackingTransparency', :path => "#{permissions_path}/AppTrackingTransparency"
  pod 'Permission-BluetoothPeripheral', :path => "#{permissions_path}/BluetoothPeripheral"
  pod 'Permission-Calendars', :path => "#{permissions_path}/Calendars"
  pod 'Permission-Camera', :path => "#{permissions_path}/Camera"
  pod 'Permission-Contacts', :path => "#{permissions_path}/Contacts"
  pod 'Permission-FaceID', :path => "#{permissions_path}/FaceID"
  pod 'Permission-LocationAccuracy', :path => "#{permissions_path}/LocationAccuracy"
  pod 'Permission-LocationAlways', :path => "#{permissions_path}/LocationAlways"
  pod 'Permission-LocationWhenInUse', :path => "#{permissions_path}/LocationWhenInUse"
  pod 'Permission-MediaLibrary', :path => "#{permissions_path}/MediaLibrary"
  pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone"
  pod 'Permission-Motion', :path => "#{permissions_path}/Motion"
  pod 'Permission-Notifications', :path => "#{permissions_path}/Notifications"
  pod 'Permission-PhotoLibrary', :path => "#{permissions_path}/PhotoLibrary"
  pod 'Permission-PhotoLibraryAddOnly', :path => "#{permissions_path}/PhotoLibraryAddOnly"
  pod 'Permission-Reminders', :path => "#{permissions_path}/Reminders"
  pod 'Permission-Siri', :path => "#{permissions_path}/Siri"
  pod 'Permission-SpeechRecognition', :path => "#{permissions_path}/SpeechRecognition"
  pod 'Permission-StoreKit', :path => "#{permissions_path}/StoreKit"

end

 

가령 예를 들어 카메라 권한을 얻고 싶다면 다음과 같이 Podfile에 추가해주어야 한다

target 'project이름' do
  permissions_path = '../node_modules/react-native-permissions/ios'
  pod 'Permission-Camera', :path => "#{permissions_path}/Camera"
  pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone"
end

 

다음으로 권한을 얻을 때 문구를 설정해주어야 한다.

아래의 권한중에서 원하는 권한을 선택한 뒤 Info.plist에 추가해주면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

  <!-- 🚨 Keep only the permissions used in your app 🚨 -->

  <key>NSAppleMusicUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSBluetoothAlwaysUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSBluetoothPeripheralUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSCalendarsUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSCameraUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSContactsUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSFaceIDUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSLocationAlwaysUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSLocationTemporaryUsageDescriptionDictionary</key>
  <dict>
    <key>YOUR-PURPOSE-KEY</key>
    <string>YOUR TEXT</string>
  </dict>
  <key>NSLocationWhenInUseUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSMicrophoneUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSMotionUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSPhotoLibraryUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSPhotoLibraryAddUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSRemindersUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSSpeechRecognitionUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSSiriUsageDescription</key>
  <string>YOUR TEXT</string>
  <key>NSUserTrackingUsageDescription</key>
  <string>YOUR TEXT</string>

  <!-- … -->

</dict>
</plist>

 

가령 카메라와 마이크를 쓴다 하면 아래처럼 추가한다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ......
    <key>NSMicrophoneUsageDescription</key>
    <string>마이크좀 빌려주셈</string>
    <key>NSCameraUsageDescription</key>
    <string>카메라좀 빌려주셈</string>
    ......
</dict>
</plist>

 

4. 권한얻기 in Android

안드로이드는 훨신 간편하다. 걍 AndroidManifest.xml에 원하는 값을 추가하면 된다.

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.myawesomeapp">

  <!-- 🚨 Keep only the permissions used in your app 🚨 -->

  <uses-permission android:name="android.permission.ACCEPT_HANDOVER" />
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
  <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
  <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
  <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
  <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
  <uses-permission android:name="android.permission.BODY_SENSORS" />
  <uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND" />
  <uses-permission android:name="android.permission.CALL_PHONE" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
  <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
  <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
  <uses-permission android:name="android.permission.READ_CALENDAR" />
  <uses-permission android:name="android.permission.READ_CALL_LOG" />
  <uses-permission android:name="android.permission.READ_CONTACTS" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
  <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  <uses-permission android:name="android.permission.READ_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_MMS" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.SEND_SMS" />
  <uses-permission android:name="android.permission.USE_SIP" />
  <uses-permission android:name="android.permission.UWB_RANGING" />
  <uses-permission android:name="android.permission.WRITE_CALENDAR" />
  <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
  <uses-permission android:name="android.permission.WRITE_CONTACTS" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  <!-- … -->

</manifest>

카메라와 마이크의 경우 아래처럼 추가한다.

 

이유는 모르겠으나 카메라를 사용하려면 MODIFY_AUDIO_SETTINGS를 반드시 설정해주어야 한다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.myawesomeapp">
  <!-- 🚨 Keep only the permissions used in your app 🚨 -->
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.MICROPHONE" />
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  <!-- … -->
</manifest>

 

위 이슈에 대해서는 아래 링크에서 확인하였다.

https://github.com/react-native-webview/react-native-webview/issues/508

 

How to use camera through Webview? · Issue #508 · react-native-webview/react-native-webview

Hi. I am a new React Native developer. Now, I am implementing some function using React Native. I want to use Camera and Mic through Webview. My site works well on Mobile Browser, but when I call t...

github.com

 

 

 

 

 

5. 코드상에서 권한 요청하기

 

하나의 권한만 요청할 때는 reuqest를 이용한다

import { request, requestMultiple, PERMISSIONS } from 'react-native-permissions';

request(Platform.OS === 'ios' ? 
  PERMISSIONS.IOS.CAMERA 
  : 
  PERMISSIONS.ANDROID.CAMERA)
  .then((result) => {
    console.log(result)
});

 

여러개의 권한을 요청할 때는 requestMultiple을 이용한다

import { request, requestMultiple, PERMISSIONS } from 'react-native-permissions';

requestMultiple(Platform.OS === 'ios' ?
    [PERMISSIONS.IOS.CAMERA, PERMISSIONS.IOS.MICROPHONE]
    :
    [PERMISSIONS.ANDROID.CAMERA, PERMISSIONS.ANDROID.MICROPHONE])
    .then((result) => {
      console.log(result)
    });

 

반응형

댓글