I am working on a flutter project using flutter_nfc_kit to scan(read) an nfc tag for a uri payload and then make use of the payload for other activities i am not doing any writing, the tag type in focus is the NTAG424 NFC TAG, i have no issues when working with TYPE 2 TAGS.
The problem is the functionality works for Type 2 tags (NTAG213, 216 etc), but when i try to scan a NTAG424 tag it returns an "ndef not found error", I use flutter_nfc_kit: ^3.5.2
, i have tested with nfc tools like "NFC tools" and "NXP TagWriter", so i confirm the tag is functional and i can see the encoded uri.
Below is the relevant code for the scanning functionality.
Future<void> _startNfcScan(BuildContext context) async {
try {
// Show the bottom sheet for Android (iOS already has a native NFC prompt)
if (!Platform.isIOS) {
await _showReadyToScanSheet(context);
}
// Start the NFC polling session
var tag = await FlutterNfcKit.poll(timeout: Duration(seconds: 10));
// Check if NDEF is available and read NDEF content
if (tag.ndefAvailable == true) {
// Read decoded NDEF records
List<ndef.NDEFRecord> ndefRecords = await FlutterNfcKit.readNDEFRecords();
if (ndefRecords.isNotEmpty) {
var firstRecord = ndefRecords.first;
// Ensure the payload is not null
if (firstRecord.payload != null && firstRecord.payload!.isNotEmpty) {
// Manually decode the compressed URI
String decodedUrl = _decodeUriPayload(firstRecord.payload!);
// Log or print the full decoded URL
print('Decoded URL from NFC tag: $decodedUrl');
// Now you have the full URL,do something with it
await _doSomething(context, decodedUrl);
// Show the "Scan Complete" bottom sheet after scanning
if (!Platform.isIOS) {
await _showScanCompleteSheet(context);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('No payload found on the NFC tag.')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('No NDEF records found on the tag.')),
);
}
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('NDEF not available on this tag.')),
);
}
} catch (e) {
// Handle errors during NFC scanning
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to read NFC tag: $e')),
);
} finally {
// Finish the NFC session
await FlutterNfcKit.finish(iosAlertMessage: 'Scan Complete');
}
}
String _decodeUriPayload(List<int> payload) {
// The first byte in the URI payload is the prefix byte
final int prefixByte = payload[0];
// The rest of the payload is the actual URI content
final uriContent = utf8.decode(payload.sublist(1));
// Map the prefix byte to the correct URL scheme
const prefixMap = {
0x00: '', // No prefix
0x01: 'http://www.',
0x02: 'https://www.',
0x03: 'http://',
0x04: 'https://',
//
};
// Get the prefix based on the prefix byte
final prefix = prefixMap[prefixByte] ?? '';
// Return the full URL by combining the prefix with the URI content
return prefix + uriContent;
}
I'm posting this as an answer since this is what worked for me:
I had to switch to using nfc_manager Then added this to info.plist and now i can successfully scan NTAG424 DNA TAGS with my app.
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
<string>8005</string>
<string>8008</string>
<string>0003</string>
<string>fe00</string>
<string>90b7</string>
<string>927a</string>
<string>86a7</string>
</array>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>A0000002471001</string>
<string>A000000003101001</string>
<string>A000000003101002</string>
<string>A0000000041010</string>
<string>A0000000042010</string>
<string>A0000000044010</string>
<string>44464D46412E44466172653234313031</string>
<string>D2760000850100</string>
<string>D2760000850101</string>
<string>00000000000000</string>
</array>
So it seems to be more of an incomplete setup issue, creaed an article on it for those interested in the full story. https://medium.com/@timidev34/solving-the-ndef-not-available-error-when-working-with-ntag424-nfc-tags-on-ios-in-flutter-26928edd717f