ISO 15693 读取多个块 returns 标签响应错误=2

ISO 15693 Read multiple blocks returns Tag response error=2

我正在尝试从 ISO-15693 NFC 标签读取多个块,但每当我开始读取它时都会收到此错误

Error Domain=NFCError Code=102 "Tag response error" UserInfo={NSLocalizedDescription=Tag response error, ISO15693TagResponseErrorCode=2}

这就是我尝试阅读它的方式

 tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
       let requestFlags = getRequestFlags(arguments["requestFlags"] as! [String])
      let blockNumber = arguments["blockNumber"] as! Int
      let numberOfBlocks = arguments["numberOfBlocks"] as! Int
        tag.readMultipleBlocks(requestFlags: requestFlags, blockRange: NSMakeRange(blockNumber, numberOfBlocks)) { dataBlocks, error in
        if let error = error {
          result(getFlutterError(error))
        } else {
          result(dataBlocks)
        }
      }
    }

然而,我通过将请求标志更改为 [.highDataRate] 设法读取单个块,但此更改对 readMultipleblocks 命令没有帮助


 tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
     let requestFlags = getRequestFlags(arguments["requestFlags"] as! [String])
     let blockNumber = arguments["blockNumber"] as! UInt8

     tag.readSingleBlock(requestFlags: [.highDataRate], blockNumber: blockNumber) { dataBlock, error in
       if let error = error {
         result(getFlutterError(error))
       } else {
         result(dataBlock)
       }
     }
   }

我找不到很多关于从 ISO-15693 标签读取多个块的示例或资源,所以任何信息或示例都会有所帮助!谢谢!

所以我设法通过使用带有异步线程的 readSingle 块找到了解决方法。读取 50 个块大约需要 0.6 秒。我不熟悉 swift 语言,所以我敢打赌这可以优化得更好。

  @available(iOS 13.0, *)
  private func handleIso15693ReadSingleBlock(_ arguments: [String : Any?], result: @escaping FlutterResult) {
    tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
        let accessQueue = DispatchQueue(label: "NFCManager.accessQueue")
        let blockCount = arguments["blockNumber"] as! UInt8

        var dataBlocks = [Data]()
        let group = DispatchGroup()

        group.enter();
        
        for i in 3...blockCount{
            accessQueue.async {
                tag.readSingleBlock(requestFlags: [.highDataRate], blockNumber: UInt8(i)) { dataBlock, error in
                  if let error = error {
                    result(getFlutterError(error))
                  } else {
                    dataBlocks.append(dataBlock)
                    if (i == blockCount){
                        group.leave();
                    }
                  }
                }
            }
        }
        group.wait()

        group.notify(queue: .main) {
               result(dataBlocks)
           }
    }
  }