Skip to main content
NFC for React Native and Expo, built on the Expo Modules API. New Architecture only, TypeScript throughout, and the asymmetry between iOS and Android visible in the type system rather than discovered in production.

Install it

Expo or bare React Native, the requirements, and why you need a development build.

Read your first tag

From an empty project to a working scan screen, step by step.

Set it up for your use case

One page per case, with both the Expo plugin option and the exact plist and manifest XML.

Coming from nfc-manager

An API equivalence table, and the six differences that change your code.

Two things to know before reading further

A tag carries no technology methods until you narrow it

tag.is('ndef') is what makes readNdef exist, in the type system and at runtime. That is how the platform difference stays visible: on iOS tag.is('mifareClassic') is always false, because CoreNFC cannot reach Crypto-1 at any OS version.

withTag always closes the session

On success, on a throw, on an abort, on a timeout, and when the platform ends the session underneath.A leaked session keeps the iOS sheet up and holds Android’s NFC controller exclusively, which is the failure that surfaces two screens later as something unrelated.

What is here

What works where

The interesting column is the one that says no. None of this is hidden behind a method that exists and then throws — nfc.capabilities and tag.is() tell you at runtime, and the types tell you before that.
NFC needs a development build. It is native code, so Expo Go cannot load it. npx expo run:ios, npx expo run:android, eas build and eas build --local all produce a build that works. See Installation.

Where to go next

Sessions

The three ways to get a tag, and which to reach for.

Tags

Narrowing, platform facets, and what a tag can do.

The NDEF codec

Building and parsing messages, with or without a device.

Error reference

Every NfcErrorCode, what causes it, what to do about it.