iOS中使用Core NFC读取NTAG213标签失败,求问题排查
无法使用Core NFC扫描NTAG213标签的排查与修复
我正在开发一款iOS应用,使用Core NFC读取NTAG213标签,参考了苹果官方的NFC标签阅读器应用示例,但始终无法扫描到NTAG213标签,无法定位问题。我修改了MessageTableViewController.swift中的相关代码,如下所示:
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) { guard let tag = tags.first else { session.alertMessage = "No tag found." session.invalidate() return } session.connect(to: tag) { error in if let error = error { session.alertMessage = "Unable to connect to tag. Error: \(error.localizedDescription)" session.invalidate() return } tag.queryNDEFStatus { ndefStatus, capacity, error in if ndefStatus == .notSupported { session.alertMessage = "Tag is not NDEF compliant." session.invalidate() return } else if let error = error { session.alertMessage = "Unable to query NDEF status of tag. Error: \(error.localizedDescription)" session.invalidate() return } tag.readNDEF { message, error in if let error = error { session.alertMessage = "Fail to read NDEF from tag. Error: \(error.localizedDescription)" } else if let message = message { DispatchQueue.main.async { // Process detected NFCNDEFMessage objects. self.detectedMessages.append(message) self.tableView.reloadData() session.alertMessage = "Scanning successful!" } } else { session.alertMessage = "No NDEF message found." } session.invalidate() } } } }
排查与修改建议
1. 检查NFC会话初始化配置
确保初始化NFCNDEFReaderSession时指定正确的协议类型(NTAG213属于ISO 14443 Type A),并根据需求设置会话失效规则:
let session = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false) session.alertMessage = "将NTAG213标签靠近设备" session.begin()
如果invalidateAfterFirstRead设为true,第一次扫描后会话会直接失效,若需要持续扫描需改为false。
2. 修正标签读取逻辑
- 你的代码在
readNDEF回调中无条件调用session.invalidate(),这会导致扫描一次后会话结束。如果需要持续扫描,应仅在出错或用户主动终止时调用该方法。 - 补充NDEF状态的完整处理,明确覆盖所有已知状态:
tag.queryNDEFStatus { ndefStatus, capacity, error in if let error = error { session.alertMessage = "查询NDEF状态失败: \(error.localizedDescription)" session.invalidate() return } switch ndefStatus { case .notSupported: session.alertMessage = "标签不支持NDEF" session.invalidate() case .readOnly, .readWrite: // 读取NDEF数据 tag.readNDEF { message, error in // 你的读取逻辑 // 若需持续扫描,不要在这里调用session.invalidate() } @unknown default: session.alertMessage = "未知的NDEF状态" session.invalidate() } }
3. 验证项目配置
- 确认
Info.plist中添加了NFCReaderUsageDescription键,填写清晰的使用说明(例如"读取NFC标签信息"),否则应用无法启动NFC会话。 - 在Xcode项目的Signing & Capabilities中添加Near Field Communication Tag Reading能力。
- 测试设备需为iPhone 7及以上机型,系统版本不低于iOS 11。
4. 验证标签有效性
使用系统自带工具(如快捷指令的NFC扫描功能)确认NTAG213标签本身正常,是否包含NDEF数据。若标签未写入任何数据,你的代码会提示"No NDEF message found",但至少能检测到标签并完成连接。
内容的提问来源于stack exchange,提问作者Varun Bantwal Shenoy
相关产品推荐
相关产品推荐

