Permissions

Host app permission requirements for the React Native Wallet SDK.

Host App Changes Required

Before testing QR, NFC, Bluetooth, or nearby-device flows, your host application must declare the required native permissions in AndroidManifest.xml and Info.plist.

Why This Matters

The SDK can support flows that rely on device capabilities such as:

  • camera access for QR-based experiences
  • Bluetooth permissions for proximity-based sharing flows
  • NFC permissions and platform setup for NFC-based sharing flows

The SDK cannot grant these permissions for your app. Your host application must add the required native configuration before these flows can work on device.

Camera Permission

Camera access is required for QR-based flows, such as scanning a verifier QR code during credential presentation.

At a high level:

  • Android apps must declare camera permission in AndroidManifest.xml
  • iOS apps must include the appropriate camera usage description in Info.plist

Bluetooth Permissions

Bluetooth-related permissions may be required for proximity-based credential or wallet sharing flows.

At a high level:

  • Android apps must declare the Bluetooth or nearby-device permissions required by the enabled flow in AndroidManifest.xml
  • iOS apps must include the appropriate Bluetooth usage description entries in Info.plist

NFC Setup

If your host application enables NFC-based flows, additional NFC platform setup may be required.

At a high level:

  • Android apps may need NFC-related permissions and feature declarations in AndroidManifest.xml
  • iOS apps must include the appropriate NFC usage declarations and entitlements for verifier-initiated NFC receive flows

Only enable and configure the NFC setup your application actually uses.

Android NFC Send Setup

For wallet-initiated NFC sharing, the wallet app emulates a Type 4 tag using Android Host Card Emulation (HCE). Add NFC and HCE declarations to your android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />
<uses-feature android:name="android.hardware.nfc.hce" android:required="false" />

Add the HCE service inside the <application> element:

<service
  android:name="com.reactnativehce.services.CardService"
  android:exported="true"
  android:enabled="false"
  android:permission="android.permission.BIND_NFC_SERVICE">
  <intent-filter>
    <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  <meta-data
    android:name="android.nfc.cardemulation.host_apdu_service"
    android:resource="@xml/aid_list" />
</service>

Create android/app/src/main/res/xml/aid_list.xml with the VECU Type 4 AID:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
  android:description="@string/app_name"
  android:requireDeviceUnlock="false">
  <aid-group
    android:category="other"
    android:description="@string/app_name">
    <aid-filter android:name="F056454355000001" />
  </aid-group>
</host-apdu-service>

The AID must match the verifier application's NFC reader configuration.

iOS NFC Receive Setup

For verifier-initiated NFC presentation requests, the wallet app reads a Type 4 tag emulated by the verifier. Add the NFC usage description and VECU ISO7816 AID to your iOS app's Info.plist:

<key>NFCReaderUsageDescription</key>
<string>Receive verification requests from verifier devices</string>

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
  <string>F056454355000001</string>
</array>

Your iOS app also needs the NFC reader session entitlement in its entitlements file and provisioning profile:

<key>com.apple.developer.nfc.readersession.formats</key>
<array>
  <string>NDEF</string>
  <string>TAG</string>
</array>

The AID value must match the verifier HCE AID. For the VECU React Native SDK flow, use F056454355000001.

iOS App ID and provisioning profile

NFC Tag Reading is a paid-Developer-Program capability. In addition to the Info.plist and entitlements entries above, the capability must be enabled on your App ID in the Apple Developer portal and included in the provisioning profile used to sign the build. If the App ID doesn't have NFC Tag Reading enabled, iOS silently refuses to start the NFC session at runtime — you'll see an authorization error in the device console with no user-facing dialog.

With Xcode's automatic signing, enabling the NFC capability under Signing & Capabilities → + Capability → Near Field Communication Tag Reading is usually enough. Xcode registers the capability against the App ID and refreshes the provisioning profile for you.

For manual signing (any production, enterprise, or TestFlight build), you must update the App ID and the provisioning profile explicitly:

  1. Sign in to developer.apple.comCertificates, Identifiers & Profiles
  2. Identifiers → select your App ID → Capabilities → enable NFC Tag ReadingSave
  3. Profiles → regenerate or create a provisioning profile that includes the updated App ID, download it, and install it in Xcode
  4. Rebuild and re-sign with the new profile

Where this lives

This step happens on the Apple Developer portal (developer.apple.com), not App Store Connect. NFC Tag Reading is not available on free Apple Developer accounts — the capability only appears for App IDs under paid Developer Program memberships.

iOS Status Bar Configuration

The SDK renders React Native's <StatusBar> component inside full-screen modals (QR scanner, NFC tap, credential presentation) to match their dark backgrounds. On iOS this routes through RCTStatusBarManager, which requires the host app to opt out of UIKit's per-view-controller status bar management.

If this key is missing, the app will crash at runtime with:

RCTStatusBarManager module requires that the UIViewControllerBasedStatusBarAppearance
key in the Info.plist is set to NO

Add the following to your iOS app's Info.plist:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

iOS only

This is an iOS-specific Info.plist setting — Android handles status bar styling through React Native's <StatusBar> component without any additional manifest entries.

Where To Make Changes

Android

Review your application's AndroidManifest.xml and confirm it includes the required declarations for the flows you plan to enable.

This commonly includes setup related to:

  • camera access
  • Bluetooth or nearby-device access
  • NFC access when applicable

iOS

Review your application's Info.plist and confirm it includes the required usage descriptions and NFC AID entries for the flows you plan to enable.

This commonly includes setup related to:

  • camera access
  • Bluetooth access
  • NFC-related capabilities and Info.plist AID entries when applicable

Flow-Specific Dependencies

Some capabilities also require additional native packages, depending on the flows you enable.

Examples include:

  • QR scanning: react-native-vision-camera
  • QR display: react-native-qrcode-svg
  • NFC send: react-native-hce
  • NFC receive: react-native-nfc-manager
  • Bluetooth sharing: react-native-ble-peripheral

See Installation for the matching package-level setup guidance.

Reference Applications

The wallet application and demo application are useful high-level references for how a host app can declare and organize these requirements.

Use them as examples of:

  • where native permission entries live
  • how host app setup is coordinated with SDK setup

Do not treat them as a line-by-line integration template for your app.

Related Guidance