You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:52:57