Swift NFC Mifare - NFCISO7816APDU sendMifare命令不支持



我正在尝试写一个Mifare Ultralight NFC,但我得到这个错误:

Optional(Error Domain=NFCError Code=1 "Feature not supported" UserInfo={NSLocalizedDescription=Feature not supported})

我用这个代码来写:

if case let NFCTag.miFare(tag) = tags.first! {
let dataMifare: [UInt8] = [240, 0, 0, 0] // READ page 4 + CRC
let dataPacketMifare = Data(bytes: dataMifare, count: dataMifare.count)
session.connect(to: tags.first!) { (error: Error?) in
let apdu = NFCISO7816APDU(instructionClass: 0xFF, instructionCode: 0xD6, p1Parameter: 0x00, p2Parameter: 0xFF, data: dataPacketMifare, expectedResponseLength: 0x02)


tag.sendMiFareISO7816Command(apdu) { (apduData, sw1, sw2, error) in
let tagUIDData = tag.identifier
session.invalidate(errorMessage: "Test")
debugPrint(apduData)
debugPrint(error)
debugPrint(tag.identifier)

我的信息。plist文件:

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>D2760000850100</string>
<string>D2760000850101</string>
</array>
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>NDEF</string>
<string>TAG</string>
</array>

我正在写一个自定义设备,其中值"0xFF"表示写请求。如果我用"0x00"它可以工作,但对于我的设备,这是一个读取请求

是我做错了什么还是IOS 13.0不支持在Mifare上写请求?

我使用的是Xcode 12.2, iOS 13.0和Iphone 11。

提前感谢您的帮助

更新1对于Andrew的回复

这是我的代码:

func handlerResponse(Result: Result< Data, Error>){
print("error")
}
let dataMifareTest: [UInt8] = [0xF0, 0, 0, 0] 
let dataPacketMifareTest = Data(bytes: dataMifareTest, count: dataMifareTest.count)
tag.sendMiFareCommand(commandPacket: dataPacketMifareTest, resultHandler: handlerResponse)

但是我得到以下错误:

NFCTagReader[516:101552] [CoreNFC] 00000002 83fd0090 -[NFCTagReaderSession transceive:tagUpdate:error:]:771  Error Domain=NFCError Code=100 "Tag connection lost" UserInfo={NSLocalizedDescription=Tag connection lost}

问题是您发送的还没有有效载荷数据。事件解释阵列[0xf0,0,0,0]只有页面请求。错误:

NFCTagReader[516:101552] [CoreNFC] 00000002 83fd0090 -[NFCTagReaderSession transceive:tagUpdate:error:]:771  Error Domain=NFCError Code=100 "Tag connection lost" UserInfo={NSLocalizedDescription=Tag connection lost}

是一个格式错误的请求。

是的,你做错了,A Mifare Ultralight不支持ISO7816标准。

如果你看https://developer.apple.com/documentation/corenfc/nfcmifaretag/3153114-sendmifareiso7816command

使用此方法向具有mifareFamily的标签发送命令NFCMiFareFamily的值。+或NFCMiFareFamily.desfire.

你不能发送Mifare超轻APDU,一些Mifare卡如desfire是多标准卡。

更新:

标签连接丢失通常意味着卡有一个错误,它进入到HALT状态,并且没有进一步的通信可以对卡进行,直到它通常通过进出射频场进行复位。

在你最初的问题中你说

我正在写一个自定义设备,其中值"0xFF"表示写请求。

但是你似乎发送它0xF0,这是不同的,可能不是一个有效的命令。

最新更新