nfcim / flutter_nfc_kit

Flutter plugin to provide NFC functionality on Android and iOS, including reading metadata, read & write NDEF records, and transceive layer 3 & 4 data with NFC tags / cards
https://pub.dev/packages/flutter_nfc_kit
MIT License
202 stars 124 forks source link

Unable to send Mifare commandos on iOS #175

Open TijnvandenEijnde opened 4 months ago

TijnvandenEijnde commented 4 months ago

I have created a mobile application to scan Mifare DESFire cards on Android and iOS. On both platforms, I can get the basic information on the card. However, only on Android, I can read data from the card by using Mifare commands. On iOS I am getting a 0B response.

I have the following configuration inside my Runner.entitlements:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>com.apple.developer.nfc.readersession.formats</key>
     <array>
      <string>TAG</string>
     </array>
</dict>
</plist>

I have added the following keys inside my Info.plist file:

<dict>
    <key>NFCReaderUsageDescription</key>
    <string>Access NFC</string>
    <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
    <array>
     <string>D2760000850100</string>
    </array>
    ...
</dict>

However, I have noticed that I will get a different response if I add the D2760000850100 key in the Info.plist file. When I have this key added I get an error when executing a Mifare command: PlatformException(500, Communication error, Tag response error, null)

So for that reason, I decided to remove the key altogether. Now everytime, I execute a Mifare command I end up with the response of 0B. Which does not tell me anything because it is not an official response.

The Mifare command I am using is the select application command: 5A123456 where 123456 is the application ID. As mentioned before this works perfectly on Android.

The only response I can get from the Mifare DESFire card is with an ISO7816 command: 00A4040006D2760000850100. Which is the select application command according to the iso7816 standard. However, after executing this command I need to authenticate, which requires a complex algorithm.

Is it necessary on iOS to first execute iso7816 commands, before you can execute Mifare commands?

Harry-Chen commented 1 month ago

Sorry for replying late. I see your thread on https://forums.developer.apple.com/forums/thread/758018 and https://github.com/okadan/flutter-nfc-manager/issues/197. But Apple does not seem to solve your problem either.

Our usage of CoreNFC APIs are not complex: https://github.com/nfcim/flutter_nfc_kit/blob/277302081ce70d3ab5aec06f1277854887e2f79c/ios/Classes/SwiftFlutterNfcKitPlugin.swift#L145-L156

I suggest that you try with native code first. If that does not work, neither flutter library can do much.