如何读取Mifare Classic 1k ISO14443-3A卡?MAUI iOS NFC适配求助
核心问题定位
Mifare Classic 1k 不属于ISO 7816标准卡片,因此你配置的com.apple.developer.nfc.readersession.iso7816.select-identifiers对它完全无效——该配置仅针对ISO 7816智能卡。以下是针对性排查步骤:
1. 确认使用正确的Session类型
必须使用NFCTagReaderSession而非NFCNDEFReaderSession:
NFCNDEFReaderSession仅能检测包含NDEF数据的标签,而Mifare Classic 1k默认不支持NDEF(除非被专门写入NDEF结构),如果你的卡片无NDEF数据,该session不会触发回调。- 正确初始化
NFCTagReaderSession的示例代码:
其中let session = NFCTagReaderSession(pollingOption: .iso14443, delegate: self, queue: DispatchQueue.main) session?.begin()pollingOption: .iso14443会覆盖Mifare Classic所属的ISO14443A标准卡片。
2. 验证Info.plist配置的正确性
确保以下配置准确无误:
- 必须包含
NFCReaderUsageDescription(NFC读取权限描述),否则session无法启动:<key>NFCReaderUsageDescription</key> <string>需要读取NFC卡片信息</string> com.apple.developer.nfc.readersession.formats需为数组类型,包含TAG值(NDEF可选):
注意:无需在此添加Mifare相关自定义标识,iOS会自动识别支持的TAG类型。<key>com.apple.developer.nfc.readersession.formats</key> <array> <string>TAG</string> <string>NDEF</string> </array>
3. 检查DidDetectTags的处理逻辑
在回调方法中,先确认标签类型是否被正确识别:
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) { guard let tag = tags.first else { session.invalidate(errorMessage: "未检测到有效卡片") return } // 确认是否为Mifare Classic标签 switch tag { case .miFare(let mifareTag): print("检测到Mifare Classic卡片,UID: \(mifareTag.uid.map { String(format: "%02x", $0) }.joined())") // 后续读取操作 session.connect(to: tag) { error in // 处理连接结果 } default: print("非Mifare Classic卡片") session.invalidate() } }
如果标签未进入.miFare分支,可尝试更换卡片确认是否为卡片本身损坏。
4. 排除设备与系统问题
iPhone 7 Plus和iOS 15.8本身支持Mifare Classic读取,测试时确保卡片紧贴iPhone顶部NFC感应区域,避免外部干扰。
内容的提问来源于stack exchange,提问作者Vasu Shanmugam
相关产品推荐
相关产品推荐

