Skip to main content
This is the default setup: nothing to configure beyond installing the plugin.

Expo

app.json
readerUsageDescription is the text iOS shows in the scanning sheet. A default is supplied, because iOS refuses to create a session when the key is missing or blank and the resulting error says nothing about Info.plist — but the default is generic, and this string is the only explanation your user gets for why the phone is asking about a card. Write your own.

Bare React Native

ios/<App>/<App>.entitlements

TAG rather than NDEF is deliberate. This library uses NFCTagReaderSession for every technology, NDEF included, so that one code path covers them all — and that session type requires the TAG format. A narrower entitlement would read better in a review and fail at runtime.
The entitlement also has to exist on the provisioning profile: in the Apple Developer portal, enable Near Field Communication Tag Reading for the App ID, then regenerate the profile. Xcode’s “Automatically manage signing” does this for you; a manually managed profile does not.

ios/<App>/Info.plist

android/app/src/main/AndroidManifest.xml

android:required="false" keeps the app installable on devices without an NFC controller. Set requireNfcHardware: true only if the app is useless without it — true removes those devices from your Play Store audience entirely.
singleTop is not optional. Without it Android recreates the activity every time a tag arrives through an intent, losing whatever was in flight. It is applied unconditionally because it is harmless when no intents are configured.

Writing

Writing needs no extra configuration, but it does need the tag to allow it:
writeNdef takes records; writeNdefBytes takes an already-encoded message, for when you have bytes from elsewhere. readNdef and readNdefBytes are the same pair in the other direction.
A blank factory tag is often NDEF formatable rather than NDEF, which is a different technology: ask for tech: ['ndef', 'ndefFormatable'] and narrow with tag.is('ndefFormatable') to format it on first write.

Next

The NDEF codec

Every record type, chunking, and tag-level framing.

Background tags

Handling a tag tapped while your app is closed.