An on-device library that tells a user exactly where to hold their phone against an NFC reader, tag, or smart lock. Most phones' NFC antennas sit in an unlabeled spot on the back panel, and a scan that misses it by a centimeter just doesn't read — this shows the user where to move their phone before they give up.
This repository contains two deliverables:
| Deliverable | Status | What it is |
|---|---|---|
NFCLocatorCore |
Done (Phase 1) | The publishable Swift package. No UI opinions about your app's screens — you place its components where you want them. |
TapSense (iOS app) |
Done (Phase 2) | A complete sample app built on the package, demonstrating every screen, confidence tier, and integration seam. |
See NFCLocatorCore/DECISIONS.md and
TapSense/DECISIONS.md for the trade-offs made building the library and
the sample app.
There is no public iOS API that reports where an NFC antenna physically sits on the running
device — Core NFC's NFCTagReaderSession reads tags, never antenna geometry, and Apple has never
needed to expose one because the system already draws its own "hold near the top of iPhone" sheet
during a scan. The resolver chain here is therefore three layers (remote catalog → bundled seed
catalog → form-factor heuristic), and Confidence.exact is reachable only via a vendor-verified
catalog entry, never a live on-device measurement. Full detail in NFCLocatorCore/DECISIONS.md.
- Phase 1 —
NFCLocatorCorepackage: complete. Builds and passes its full unit test suite (swift test, 52/52 passing) both on the local macOS host and for iOS Simulator (xcodebuild -scheme NFCLocatorCore -destination 'generic/platform=iOS Simulator'). - Phase 2 —
TapSensesample app: complete. Every screen (onboarding, home dashboard, "My Phone" antenna detail, guided tap flow, live tap test via Core NFC, phone selection/preview, troubleshooting, settings, privacy) is driven end-to-end in the iOS Simulator against all four confidence tiers, light and dark appearance, and a manual phone override. 44/44 app-level unit tests passing. SeeTapSense/README.mdto build and run it.
- TapSense's live Tap Test (Core NFC) failed on at least one tested physical device with a
"Missing required entitlement" (
NFCErrorcode 2) error. The root cause is identified — the App ID's NFC Tag Reading capability was never registered on the Apple Developer Portal, a known sharp edge of Automatic signing plus a generated (XcodeGen) project where declaring the entitlement key inproject.ymlalone doesn't trigger that registration — and the app's own error reporting was fixed so this failure mode is no longer silently misreported as a generic timeout. SeeTapSense/DECISIONS.mdfor the full investigation and the exact fix (Xcode → Signing & Capabilities → + Capability). This fix requires the account holder's own Apple Developer Portal access and has not yet been re-verified working end-to-end on a real device — do not submit TapSense to App Review until that re-verification is done. - This repository has a pushed remote but no tagged release yet — SwiftPM remote installs
and CocoaPods publication both need a tag before they'll resolve
0.1.0. SeeNFCLocatorCore/README.md's "Versioning & releasing" section for the exact steps. - See
docs/app-store/README.mdfor the full App Store Connect submission checklist, andNFCLocatorCore/README.md's "Versioning & releasing" section for the SwiftPM/CocoaPods publish process.
See CONTRIBUTING.md. Security issues: see SECURITY.md, not
a public issue. This project follows the Code of Conduct. Changes are
tracked in CHANGELOG.md.
MIT — see LICENSE. Copyright (c) 2026 Nagarjuna Vutkuri Swamy.