## Unreleased ## [4.0.0](https://github.com/revtel/react-native-nfc-manager/releases/tag/v4.0.0) (2026-10-09) ### v3-to-v4 migration - Require React Native 0.76+ with the New Architecture enabled on RN 0.76–0.81; RN 0.82+ is New Architecture only. Expo consumers use Development Builds. v3 remains available through `@3`. - Move the native implementation to TurboModule/Codegen, focused Android handlers and Swift with an Objective-C++ bridge, preserving the documented v4 session, cancellation, event and API contract. - Ship compiled TypeScript with public declarations; account for optional NDEF payloads and platform-specific tag fields. See the [migration guide](https://github.com/revtel/react-native-nfc-manager/blob/main/docs/MIGRATING_V3_TO_V4.md). - Include beta-series fixes for RN 0.76/0.77 Codegen, NDEF Buffer/Uint8Array decoding and supplementary Unicode, Android live NDEF reads (PR #843), iOS ISO 15693 bridge scalar alignment, Expo config-plugin idempotence/permission opt-out and published-package Babel isolation. Individual beta entries below retain their original details and evidence. - Compiler checks and reused device records have separate identities. Hosted EAS/App Store, iOS ISO 15693 hardware and some technology-specific/timeout flows remain unverified; see the [release validation record](docs/V4_STABLE_RELEASE_2026-10-09.md). ### Changed - Add one-time development warnings for unsupported React Native versions and missing New Architecture runtime signals on RN 0.76–0.81, before native initialization. Missing native modules now report linking/rebuild and Expo Development Build guidance. ### Tooling - Update the pinned Expo SDK 57 validation/smoke consumer from 57.0.25 to 57.0.27 to satisfy current Expo Doctor patch expectations; React Native remains 0.86.3. Historical device evidence retains its original Expo version. - Promote the v4 history to main and preserve the original main history on v3. Shared publication policy selects latest for v4 stable on main, beta for v4 beta, and legacy for v3. Validate exact candidate-branch CI and preserve GitHub prerelease/latest classification. ### Documentation - Shorten the README and organize v4 setup, usage and API guides into a searchable static documentation site with isolated VitePress tooling and a documentation-only build check. - Make New Architecture and Expo Development Builds the primary v4 entrypoints; add Expo troubleshooting for native rebuilds, plugin dependencies, Android SDK warnings, Directory metadata and iOS entitlements. - Define change-risk-based hardware retesting and attributed evidence reuse; retain first-stable evidence review and final-candidate compiler gates. - Document v3 legacy maintenance, independent npm/GitHub verification, branch-bound tooling and recovery. ## [4.0.0-beta.11](https://github.com/revtel/react-native-nfc-manager/compare/v4.0.0-beta.10...v4.0.0-beta.11) (2026-10-09) ### Example - Add Android read-only NFC-V and ISO-DEP metadata actions and explicit discovery start/stop controls for physical-device validation. ### Fixed - Merge contributor PR #843 (fixes #842): Android `getNdefMessage()` now reads through the connected NDEF handle and returns current tag contents instead of discovery-time cached contents. The cached API and discovery behavior remain unchanged; a tag with no NDEF message returns `ndefMessage: []` on the live-read path. - Preserve emoji and other supplementary Unicode characters when decoding NDEF text and URI records; reject decoded values above the Unicode maximum. Ports the main #852 fix to v4. - Keep repository Babel configuration out of published packages, retaining the TypeScript preset for local tests. Ports the main #835 fix to v4. - Reject published Babel configuration in the package-content verification gate. ### Verification - Record Android 12 / Samsung SM-N975U1 physical-device NFC-V and ISO-DEP over NFC-A discovery/getTag metadata agreement and cleanup. ISO-DEP over NFC-B remains unverified. - PR #843 includes contributor-reported same-session write/read evidence on Galaxy A53 / Android 16 / MIFARE Ultralight. Maintainer read-only testing passed; maintainer same-session write/read validation remains pending a writable NDEF tag. ## [4.0.0-beta.10](https://github.com/revtel/react-native-nfc-manager/compare/v4.0.0-beta.9...v4.0.0-beta.10) (2026-10-03) ### Release preparation - Added GitHub Actions publishing through npm Trusted Publisher with exact-commit validation, complete Android/iOS CI gates, verified package artifacts, and provenance. - Hardened v4 release entrypoints with automatic next-beta selection within the current series, explicit stable/new-series versions, unpublished-version checks, safe option forwarding, branch checks, and basic quality gates before publication. - Added separate RN 0.84 Android/iOS CI build jobs and example mocked tests; hosted execution is recorded separately from local validation. - Added v3-to-v4 migration and stable cutover guidance, corrected clean-checkout example setup, and updated introductory NFC lifecycle handling. The package remains a beta pending separate stable-candidate validation and publication. ### Android tag metadata - Added optional cached NFC-A (`atqa`, `sak`), NFC-V (`dsfid`, `responseFlags`), and ISO-DEP (`historicalBytes`, `hiLayerResponse`) fields to Android tag results. These are discovery-time values; reading them does not start another NFC exchange. NFC-A fields were observed on Android 12 with NTAG215; NFC-V and ISO-DEP metadata remain unverified on hardware. ### TypeScript tag results - Corrected `TagEvent.ndefMessage` to be optional: native `getTag()` and discovery results can omit it. TypeScript consumers that iterate records should use `tag.ndefMessage ?? []` or check for its presence. This is a TypeScript source-compatibility change; JavaScript and native payloads are unchanged. - Declared existing Android NDEF writability/read-only fields and iOS technology-specific tag fields. No new NFC metadata is collected and the TurboModule Codegen contract is unchanged. - Corrected `NdefRecord.id` to accept Android's hexadecimal string or iOS's byte array. TypeScript consumers that assumed only byte arrays must narrow the value first. ### Expo Development Build support - Updated the pinned Expo validation and smoke consumer to 57.0.25 to match Expo Doctor's expected SDK patch range; React Native remains 0.86.3. The local compiler/Doctor gate and basic iPhone/Android regressions passed, with the documented Directory metadata warning retained. - Added an Android scan prompt to the Expo smoke app with shared cancellation and cleanup handling, plus error-subclass logging. Recorded basic iPhone and Android physical-device smoke results, including NTAG215 NfcA reads; remaining validation gaps are listed in the test record. - Hardened the packaged Expo config plugin for repeated evaluation, explicit permission opt-out, and current Expo Gradle layouts. - Added a pinned packed-package Expo SDK 57 / React Native 0.86 New Architecture consumer validator for prebuild, Expo Doctor, Android, and iOS release gates. - Documented Expo Development Builds as the supported Expo path; Expo Go remains unsupported, and local compilation is not presented as hosted EAS or physical-device NFC evidence. ### Fixed - Fixed `Ndef.decodeMessage()` to accept Buffer and Uint8Array inputs, including subarrays, without modifying the input. DataView and non-byte typed arrays remain unsupported. - Aligned the iOS ISO 15693 `getSystemInfo` bridge parameter with the generated TurboModule scalar protocol while preserving the existing internal NSNumber call. ## [4.0.0-beta.9](https://github.com/revtel/react-native-nfc-manager/compare/v4.0.0-beta.8...v4.0.0-beta.9) (2026-09-08) ### Bug Fixes - Support React Native 0.76 and 0.77 TypeScript Codegen event parsing by using a directly imported `EventEmitter` type. ## [4.0.0-beta.8](https://github.com/revtel/react-native-nfc-manager/compare/v4.0.0-beta.7...v4.0.0-beta.8) (2026-09-08) This section records changes since `v4.0.0-beta.7`. It does not announce a release or promote v4 to stable. ### Changed - Migrated the library source to TypeScript, the iOS implementation to Swift with an Objective-C++ bridge, and the Android implementation into focused Java handlers. - Updated the primary development example to React Native 0.84 with the New Architecture enabled. - Aligned the public runtime API, `index.d.ts`, public type coverage, TurboModule Codegen spec, and applicable native implementations. - Added repeatable package-content validation and confirmed `prepack` rebuilds the untracked `dist/` output used by consumers. - Routine CI now uses Node.js 22 and remains limited to JavaScript and TypeScript validation. Android/iOS compiler checks and physical-device NFC checks are separate release gates. ### Fixed - Native request callbacks and cleanup paths now prevent repeated completion and stale callback/session ownership across success, error, cancellation, timeout, repeated-request, and lifecycle paths. - Android cancellation cleans up temporary tag registration and NFC lifecycle resources. - iOS session state changes are serialized and session callbacks are completed at most once. - Common, Android-only, iOS-only, deprecated, unsupported, and compatibility-alias declarations now match the intended v4 runtime contract. ### Compatibility and migration notes - Removed the unintended refactor-only `hello` and `echo` runtime helpers; they were not part of the declared or documented v4 API. - Direct NDEF compatibility methods and `getBackgroundNdef()` remain available. - The misspelled iOS ISO 15693 `stayQuite()` entry point remains as a compatibility alias for `stayQuiet()`. - Deprecated Android `setNdefPushMessage()` continues to reject explicitly rather than acting as a supported operation. - The v4 support floor is React Native 0.76 with the New Architecture enabled. React Native 0.82 and newer are New Architecture only. The verified development and compiler baseline is React Native 0.84; React Native 0.76–0.83 remains best-effort/unverified until corresponding evidence is recorded. - The package now declares React 18.2 and React Native 0.76 as its minimum peer versions, and the podspec now declares iOS 15.1 to match that React Native support floor. ### Known limitations - Jest and example Jest use native mocks and do not verify NFC hardware behavior. - Simulator/emulator and compiler success do not verify tag discovery, I/O, cancellation timing, timeout, background/resume, or cleanup on a physical device. - Physical-device results must be recorded separately by platform, device, OS, tag technology, flow, and outcome before release-candidate review. - Completion of this closeout makes another v4 beta eligible for review; stable promotion remains a separate decision. ## [3.0.2](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.1...v3.0.2) (2021-02-22) ### Features * **android:** allow requestTechnology resolves to tags even when tech ([8b7f862](https://github.com/whitedogg13/react-native-nfc-manager/commit/8b7f8629a8e46304f2a68d62f01e745047fe01dc)) ## [3.0.1](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.0...v3.0.1) (2021-02-20) ### Bug Fixes * [#371](https://github.com/whitedogg13/react-native-nfc-manager/issues/371) missing MIFARE_BLOCK_SIZE for mifareClassicHandlerAndroid ([b136419](https://github.com/whitedogg13/react-native-nfc-manager/commit/b1364197c80ab16542bbb823483a2079a896e169)) # [3.0.0](https://github.com/whitedogg13/react-native-nfc-manager/compare/v3.0.0-0...v3.0.0) (2021-02-18) ### Features * expose RTD_URI_PROTOCOLS ([26516a7](https://github.com/whitedogg13/react-native-nfc-manager/commit/26516a7ce8309ade21464df13a8e5c799c0e417c)) # [3.0.0-0](https://github.com/whitedogg13/react-native-nfc-manager/compare/v2.0.0-beta.1...v3.0.0-0) (2021-02-10) ### Bug Fixes * disable 18092 polling (cause iOS freeze) ([64115f8](https://github.com/whitedogg13/react-native-nfc-manager/commit/64115f80f8cd93ed5ef3b01987d6c628a5a9127b)) * **ios:** add polling for iso18092 ([b7984a5](https://github.com/whitedogg13/react-native-nfc-manager/commit/b7984a59ea27076d7fd34a2614592f468c80f5e1)) * add callback type null possible ([1371533](https://github.com/whitedogg13/react-native-nfc-manager/commit/13715334ea908b89654b42eba4ec902bcc6f4229)) * cancelTechnology might cause exception if there's a connected tag ([af2f1f9](https://github.com/whitedogg13/react-native-nfc-manager/commit/af2f1f92bbd7bfcf8c604db48b790289c3ca4946)) * cancelTechnology might cause exception if there's a connected tag ([dcb26b8](https://github.com/whitedogg13/react-native-nfc-manager/commit/dcb26b85a955ce17ae633e00f6f189a895e8adcb)) * getNdefMessage should use the same structure for platforms ([73859fb](https://github.com/whitedogg13/react-native-nfc-manager/commit/73859fbac8939277f1e7fc2ad13ececee8c9d4c7)) * import NfcManager from new location ([c95cc76](https://github.com/whitedogg13/react-native-nfc-manager/commit/c95cc76a0a3b52c751c1a0f00895cf1b34b66b28)) * ios isSupported ([adcc966](https://github.com/whitedogg13/react-native-nfc-manager/commit/adcc966c8ed4a565c2800fabc5e5a0cad07ea376)) * promise won't be rejected when calling cancelTechnologyRequest in ([64c9cbd](https://github.com/whitedogg13/react-native-nfc-manager/commit/64c9cbd05e34e975fa4744727859efd08ea610bf)) * reject tech request promise when native iOS cancel button is pressed ([7915b98](https://github.com/whitedogg13/react-native-nfc-manager/commit/7915b98132cf5c6f86eb96dfe242b67bef32e8a7)) * remove getNdefMessage's parameter declaration ([6fc257e](https://github.com/whitedogg13/react-native-nfc-manager/commit/6fc257e61e1da5600a7aac44d9a8a97a7ecc988c)) ### Features * extract more NfcTech handlers ([0032408](https://github.com/whitedogg13/react-native-nfc-manager/commit/0032408af21cafa3f5f92c16083f914325450524)) * **android:** getNdefStatus ([4cc68ce](https://github.com/whitedogg13/react-native-nfc-manager/commit/4cc68ce233d81c03760b791fc2f568fe4b8415c4)) * **ios:** enhance didDetectTags and add queryNDEFStatus / makeReadOnly ([32dd3be](https://github.com/whitedogg13/react-native-nfc-manager/commit/32dd3be2968abbe095ae42fd12793a9a8c0725c6)) * invalidateSessionWithErrorIOS ([c631110](https://github.com/whitedogg13/react-native-nfc-manager/commit/c631110b6454c08821607014a28b8dffb20fe8b0)) * ios 13 ndef read and write ([31a3ae6](https://github.com/whitedogg13/react-native-nfc-manager/commit/31a3ae6e141e41f3f36a102d5c2bb5ce04ba78a5)) * requestTechnology support multi-techs ([65e8f02](https://github.com/whitedogg13/react-native-nfc-manager/commit/65e8f02b83820cb72e65c8443a607b6dca2c8fae)) # [2.0.0-beta.1](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.9...v2.0.0-beta.1) (2019-07-13) ### Bug Fixes * call the correct method `mifareUltralightReadPages` (notice the tailing s) ([60feee8](https://github.com/whitedogg13/react-native-nfc-manager/commit/60feee88c2d20bc18af23b3abb6d8cb22fe17e16)) * ios crash on registerTagEvent ([e654d93](https://github.com/whitedogg13/react-native-nfc-manager/commit/e654d9359751327284d20b3bee1139c78657dcb4)) * MifareClassic should also support `transceive` ([dd4a902](https://github.com/whitedogg13/react-native-nfc-manager/commit/dd4a902257a402e5d6d3eae8bd43f9d37c03928b)) * use non-cached ndef for getNdefMessage API ([49f8541](https://github.com/whitedogg13/react-native-nfc-manager/commit/49f85415a5bc6d0218992dc6ba2b9303cee8e3ac)) ### Features * mifareultralight support ([4a53a13](https://github.com/whitedogg13/react-native-nfc-manager/commit/4a53a135c594ef340927ae053dfc142ebfd0b9b6)) * support `getMaxTransceiveLength` and `setTimeout` ([e759c39](https://github.com/whitedogg13/react-native-nfc-manager/commit/e759c399008e9060ae6f5fe23d7b31a61b1f8037)) ## [0.0.9](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.8...0.0.9) (2018-01-02) ## [0.0.8](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.7...0.0.8) (2017-12-09) ## [0.0.7](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.6...0.0.7) (2017-12-04) ## [0.0.6](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.3...0.0.6) (2017-11-17) ## [0.0.3](https://github.com/whitedogg13/react-native-nfc-manager/compare/0.0.2...0.0.3) (2017-09-27) ## 0.0.2 (2017-08-01)