Inability to Communicate via APDU on iOS Despite NFC Tag Detection

Background: We are developing a cross-platform mobile application that communicates with a custom NFC-enabled hardware device. The hardware expects ISO7816-style APDU commands for data exchange and functions correctly with Android using the IsoDep protocol.

Observed Issue on iOS: On iOS, the tag is only detectable via NFCNdefReaderSession, which provides access to INFCNdefTag.

Attempting to use NFCTagReaderSession with NFCPollingOption.Iso14443 (which is required for APDU communication) results in no tag detection.

As a result, the tag is inaccessible for APDU-based communication on iOS.

Since NFCNdefReaderSession does not support APDU, we are unable to establish the required command channel.

Constraints: The hardware firmware cannot be changed to support NDEF-based command interpretation.

The device expects raw ISO-DEP APDU commands (i.e., Class-Instruction-Param1-Param2-Data-Le).

Impact: The lack of ISO7816 tag detection on iOS prevents the app from sending APDU commands, resulting in a platform-specific feature limitation.

Functionality that relies on secure, structured APDU communication is unavailable to iOS users, even though it works seamlessly on Android.

Do you have the correct AIDs for the NFC device entered in the com.apple.developer.nfc.readersession.iso7816.select-identifiers entry in your Info.plist?

Keep in mind that the AIDs have to be an exact match, and you cannot use shortened prefixes

Good Morning Hi I have Just added NFC Permission in Info.plist and formats in Entitlement.plist will that wont be sufficient to launch NFC reader

If No, can you share me a Sample .plist and Entitlements with corrections you have suggested. Meanwhile I will try from my end also to check on the suggestion you have provided. But sample would be really helpful to solve my issue. Thanks in Advance

How do i get the AID of the NFC Hardware Device? Even though in get that its says we need to get apple approval for adding such an identifier in the Info.plist and Entitlements. How to get those Approvals ?

You can check out https://developer.apple.com/documentation/corenfc/building-an-nfc-tag-reader-app for an example of how the entitlements and Info.plist entries are constructed.

I can't help you with getting the AID of the NFC device. You may need to contact the manufacturer, if the AIDs are not standard, or documented.

Approval depends on what you are trying to do. In order to just read from the tag, or write to the tag, you don't need any approval.

If you are trying to emulate a tag (the NFC hardware you are using is a reader), or if the AIDs you are using are of restricted nature (like payment intent, identification, etc.) then you need approval and depending on the region you are operating in, that may or may not be possible, and will require an extensive application process.

My question is: If I add the AID entries in both Info.plist and Entitlements.plist within the project, is that sufficient to enable and launch the NFC session, or do I also need to explicitly configure this AID in the Apple Developer portal (under App ID capabilities) and regenerate the provisioning profile with this change?

The AIDs are configured in the Info.plist There is no Developer Portal configuration necessary (or possible).

A new provisioning profile would have been needed if you had changed your .entitlements file. You don't add AIDs to the entitlements. But if you are making changes to your entitlements, then you will need a new provisioning profile.

attempting to switch to NFCTagReaderSession to communicate at the ISO-DEP / APDU level fails silently. The tagReaderSession(_:didDetect:) delegate is never called, even though the same physical tag is clearly present and readable via the NDEF session.

From my observation, it appears that on iOS, once a tag is handled as an NDEF Type 4 tag, Core NFC does not reliably expose it again through NFCTagReaderSession for raw ISO-DEP / APDU communication—especially for NFC-B tags. The session starts successfully but does not surface the tag for APDU exchange.

This raises an important question: Is there any supported way on iOS to reliably issue custom APDU commands to ISO 14443-4 (NFC-B) tags like the TI RF430, or is APDU access effectively restricted/filtered by Core NFC when the tag is NDEF-formatted? If this is a platform limitation, it would be helpful to have clarity on whether iOS intentionally blocks APDU-level access for such tags.

we are stuck here but in Android As it is inbuilt ISO dep layer the communication is happening as expected but for us we are facing issue in IOS Tagreadersession as it fails Silently. attaching the Tag details in the next comment

This is Tag I am trying to establish the connection with

You can't switch sessions once connected, but you can connect to an NDEF tag by using NFCTagReaderSession and do both NDEF and non-NDEF actions.

Because NFCISO7816Tag inherits from NFCNDEFTag it gains all its capabilities and then adds more specific functionality.

If a NFCTag returned from a NFCTagReaderSession supports NDEF, NDEF operations (query NDEF status, write and read NDEF) are performed internally, and the NDEF data should be available as properties in the same NFCTagReaderSession.

No I am using TagReaderSession only but its failing silently Did detect is not getting called for the tag mentioned above in screenshot this is how i am intiating the NFC Session is this correct way or anything is Missed public class NfcServiceIos : INfcServiceIos {

     private SessionDelegate _currentDelegate;
    private bool _sessionActive = false;
    private NFCTagReaderSession _currentSession;

    public async Task SendAsync(byte[] bytes)
    {
        var isNfcAvailable = UIDevice.CurrentDevice.CheckSystemVersion(11, 0);
        if (isNfcAvailable && NFCTagReaderSession.ReadingAvailable)
        {
            if (_sessionActive)
            {
                await Application.Current.MainPage.DisplayAlert("Error", "NFC session is still active. Please wait.", "Ok");
                return;
            }

            _sessionActive = true;
            _currentDelegate = new SessionDelegate(bytes, OnSessionInvalidated);

            // All CoreNFC session code must be on the main thread!
            await Microsoft.Maui.ApplicationModel.MainThread.InvokeOnMainThreadAsync(() =>
            {
                // create NFCTagReaderSession instead of NFCNdefReaderSession
                _currentSession = new NFCTagReaderSession(NFCPollingOption.Iso14443,_currentDelegate, null);
                _currentSession.AlertMessage = "Please hold your device near the NFC tag";
                _currentSession.BeginSession();
            });

            var status = await _currentDelegate.WasDataTransmitted.Task;
            _currentSession = null;
            _currentDelegate = null;

            if (status != NfcTransmissionStatus.Success)
            {
                await Application.Current.MainPage.DisplayAlert("Error", "Suitable error message", "Ok");
            }
        }
        else
        {
            await Application.Current.MainPage.DisplayAlert("Error", "Read is not supported by this tag", "Ok");
        }
    }

    private void OnSessionInvalidated()
    {
            Application.Current.MainPage.DisplayAlert("Error", "Read Sesssion Invalidated Silently ", "Ok");
        _sessionActive = false;
    }
Inability to Communicate via APDU on iOS Despite NFC Tag Detection
 
 
Q