iOS CoreNFC框架读取NFCISO15693Tag多块数据报连接丢失错误
ISO15693标签读取断连问题修复方案
- 调整请求标志位参数
绝大多数消费级ISO15693标签不支持高数据率传输,你当前使用的.highDataRate参数是触发连接丢失的高频原因,可先替换为通用兼容的空参数,或者根据标签规格手册指定对应标志位,示例:requestFlags: [] - 校验块读取范围合法性
首先确认目标标签的可用块数量≥你指定的4块,另外不少厂商的标签前0-2块为出厂锁定的信息区,不支持批量读取,可先尝试读取单块验证链路正常:blockRange: NSRange(location: 0, length: 1),单块读取正常后再逐步调整读取长度 - 增加连接后等待延时
部分NFC硬件在完成连接动作后需要极短的就绪时间,可在connect的回调中增加10~50ms的延时再发起读请求,避免底层通信未就绪触发断连 - 补充会话生命周期处理
你当前的代码未处理会话的结束逻辑,读写完成或报错后需主动调用session.invalidate()释放NFC会话资源,避免后续请求异常,同时注意闭包内的循环引用问题,建议添加弱引用修饰。
修改后的参考代码如下:
session.connect(to: iso93tag, completionHandler: { [weak session] (error: Error?) in guard error == nil, let session = session else { session?.invalidate(errorMessage: "标签连接失败") return } // 增加20ms延时等待硬件就绪 DispatchQueue.global().asyncAfter(deadline: .now() + 0.02) { iso93.readMultipleBlocks(requestFlags: [], blockRange: NSRange(location: 0, length: 4)) { data, error in if let error = error { print("读取失败: \(error)") session.invalidate(errorMessage: "读取失败") return } // 此处处理读取到的data数据 session.invalidate() } } })
如果上述方案执行后仍存在问题,可再次校验entitlements文件是否已添加com.apple.developer.nfc.readersession.iso15693专属权限,避免仅开启通用NFC权限导致的功能受限。
内容的提问来源于stack exchange,提问作者Rasmiranjan sahu
相关产品推荐
相关产品推荐

