Swift NFC Mifare - 不支持 NFCISO7816APDU sendMifare 命令
Swift NFC Mifare - NFCISO7816APDU sendMifare Command not supported
我正在尝试写入 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)
我的 Info.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”更改该值,它会起作用,但对于我的设备来说,它是一个 read request
是我哪里做错了还是IOS13.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}
是的,您做错了什么,Mifare Ultralight 不是支持 ISO7816 的卡。
如果你看
https://developer.apple.com/documentation/corenfc/nfcmifaretag/3153114-sendmifareiso7816command
它说
Use this method to send commands to tags that have a mifareFamily
value of either NFCMiFareFamily.plus or NFCMiFareFamily.desfire.
您不能发送 Mifare Ultralight APDU,一些 Mifare 卡如 desfire 是多标准卡。
更新:
标签连接丢失通常意味着卡有错误并且它会进入 HALT 状态并且不能与卡进行进一步的通信,直到它通过通常进出 RF 场进行重置。
在你原来的问题中你说
I'm writing to a custom device where the value "0xFF" means a write request.
但您似乎发送的是 0xF0
,这是不同的,可能不是对它的有效命令。
问题是你发送的没有负载数据。
数组 [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}
请求格式错误。
我正在尝试写入 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)
我的 Info.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”更改该值,它会起作用,但对于我的设备来说,它是一个 read request
是我哪里做错了还是IOS13.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}
是的,您做错了什么,Mifare Ultralight 不是支持 ISO7816 的卡。
如果你看 https://developer.apple.com/documentation/corenfc/nfcmifaretag/3153114-sendmifareiso7816command
它说
Use this method to send commands to tags that have a mifareFamily value of either NFCMiFareFamily.plus or NFCMiFareFamily.desfire.
您不能发送 Mifare Ultralight APDU,一些 Mifare 卡如 desfire 是多标准卡。
更新:
标签连接丢失通常意味着卡有错误并且它会进入 HALT 状态并且不能与卡进行进一步的通信,直到它通过通常进出 RF 场进行重置。
在你原来的问题中你说
I'm writing to a custom device where the value "0xFF" means a write request.
但您似乎发送的是 0xF0
,这是不同的,可能不是对它的有效命令。
问题是你发送的没有负载数据。 数组 [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}
请求格式错误。