Expo 설정
Expo 프로젝트에서 Continuous Native Generation(expo prebuild / 개발 클라이언트)을 사용한다면 config plugin으로 react-native-nitro-device-info를 설정할 수 있습니다. ios/나 android/를 직접 편집하지 않아도 됩니다.
Expo 개발 빌드 또는 EAS Build를 사용하세요. Expo Go에는 이 네이티브 모듈이 없습니다. Expo SDK와 호환되는 React Native 및 Nitro 버전을 선택하세요.
설치
네이티브 모듈은 autolinking으로 등록됩니다. 대부분의 API는 이 과정만으로 사용할 수 있으므로 plugins 배열에 plugin을 추가하지 않고 npx expo prebuild를 실행할 수 있습니다.
config plugin이 필요한 경우
일부 API가 사용하는 네이티브 기능에는 권한이나 entitlement가 필요합니다. 이 설정은 선택 사항이며 plugin은 요청한 항목만 추가합니다. 사용하지 않는 권한을 요청하면 앱 스토어 심사에서 거절될 수 있습니다. app.json 또는 app.config.js의 plugins 배열에 추가하고 필요한 옵션을 켜세요.
Expo가 네이티브 디렉터리를 관리한다면 plugin 옵션을 바꾼 뒤 네이티브 디렉터리를 다시 생성하세요. --clean은 ios/와 android/를 삭제하고 다시 만듭니다. 직접 수정한 네이티브 코드는 실행 전에 따로 보관하세요.
prebuild 후 npx expo run:ios, npx expo run:android 또는 EAS Build로 네이티브 앱을 다시 빌드하고 설치하세요. JavaScript 서버만 재시작하면 네이티브 변경이 적용되지 않습니다.
Plugin 옵션
Plugin은 권한을 선언할 뿐 런타임에 요청하거나 Android 일련번호 제한을 우회하지 않습니다. 라이브러리는 처음 접근할 때 serialNumber를 캐시하므로 필요한 권한은 읽기 전에 요청하세요.
자동으로 추가하지 않는 설정
getInstallReferrer(),getHasGms(): Play Install Referrer와 Google Play Services 의존성은 라이브러리의 Gradle 빌드에 포함됩니다. 사용하는 앱에서 매니페스트나 Gradle을 바꿀 필요가 없습니다.- 위치 및 통신사 API:
getIsLocationEnabled()와 통신사 getter는 권한을 요청하지 않고 전역 시스템 상태를 읽습니다.Info.plist의 용도 설명 키가 필요하지 않습니다. isSideLoadingEnabled(): 아래를 참고하세요.
isSideLoadingEnabled()의 수동 설정
isSideLoadingEnabled()는 canRequestPackageInstalls()를 호출합니다. 앱이 Android REQUEST_INSTALL_PACKAGES 권한을 선언해야 true를 반환할 수 있습니다. Google Play는 이 권한을 제한 권한으로 분류하므로 plugin은 이 권한을 추가하지 않습니다. 사용자가 직접 시작한 설치 과정에서 실제로 패키지를 설치하는 앱에만 허용됩니다. 사이드로딩 상태 조회만을 위해 선언하면 Play 심사에서 거절될 수 있습니다.
앱이 사용 요건을 충족한다면 expo-build-properties plugin이나 작은 커스텀 plugin으로 권한을 추가하고 Play Console 권한 신고에서 용도를 설명하세요. 권한이 없으면 isSideLoadingEnabled()는 false를 반환합니다.
Device attestation(App Attest / Play Integrity)
서버에서 검증할 device attestation 토큰을 발급하는 선택 패키지 react-native-nitro-device-integrity에는 별도의 config plugin이 있습니다.
Entitlement 값은 항상 development로 기록합니다. TestFlight나 App Store로 배포하는 빌드는 iOS가 이 값을 무시하고 자동으로 프로덕션 환경을 사용하므로 두 환경에서 같은 값을 사용할 수 있습니다.
Plugin은 entitlement를 기록하지만 App ID에서 App Attest 기능을 켤 수는 없습니다. Apple Developer 포털에서 App ID의 App Attest를 켜거나 EAS / Xcode 자동 서명으로 관리하세요. 기능이 없으면 빌드 서명이 실패합니다(오류 0xE8008016).
Play Integrity(Android)와 DeviceCheck(iOS)는 entitlement나 권한이 필요하지 않습니다. Play Integrity의 런타임 cloudProjectNumber만 필요하므로 config plugin을 요구하지 않습니다.
결과 확인
npx expo prebuild --clean 후 추가한 설정을 확인하세요.
enableSerialNumber를 켰다면android/app/src/main/AndroidManifest.xml에<uses-permission android:name="android.permission.READ_PHONE_STATE" />가 있어야 합니다.appAttest를 켰다면ios/<app>/<app>.entitlements에appattest-environment키가 있어야 합니다.
Plugin은 멱등성을 유지하므로 prebuild를 다시 실행해도 항목이 중복되지 않습니다.
