Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to send Mifare commandos on iOS #175

Open
TijnvandenEijnde opened this issue Jun 25, 2024 · 1 comment
Open

Unable to send Mifare commandos on iOS #175

TijnvandenEijnde opened this issue Jun 25, 2024 · 1 comment

Comments

@TijnvandenEijnde
Copy link

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
Copy link
Contributor

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

Our usage of CoreNFC APIs are not complex:

case let .miFare(tag):
tag.sendMiFareCommand(commandPacket: data) { (response: Data, error: Error?) in
if let error = error {
result(FlutterError(code: "500", message: "Communication error", details: error.localizedDescription))
} else {
if req is String {
result(response.hexEncodedString())
} else {
result(response)
}
}
}

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants