Skip to main content
Suica, PASMO, Octopus, and the rest of the FeliCa family.
Every FeliCa command addresses the card by its IDm, which is why it is passed explicitly. polling obtains one; on iOS tag.ios?.idm carries it too. Full API in Tag protocols.

The iOS rule

As with ISO 7816 AIDs, iOS filters FeliCa at the radio: a card whose system code is not declared in Info.plist never reaches the app. No error, no event.
FFFF is the wildcard and matches any system code. It is the right value while you are working out which system code a card uses, and usually the wrong value to ship, because it means every FeliCa card in the user’s wallet is a candidate.

Expo

app.json
Each code is exactly two bytes of plain hex. The plugin rejects any other length, since a wrong-length code is accepted by the build and matches nothing on device.

Bare React Native

ios/<App>/<App>.entitlements

ios/<App>/Info.plist

android/app/src/main/AndroidManifest.xml

Platform differences worth knowing

Both platforms reach FeliCa, but not identically:
On iOS the session must include the iso18092 polling option; asking for tech: ['felica'] sets it for you.
iOS exposes both on the tag’s ios facet. Android gives you the IDm as the tag id and the PMm through a polling command.
Android’s maxTransceiveLength is chipset-dependent and worth checking before sending a long multi-block read.