私はMifareカードのUIDを再集計したいです。 iPhone X、Xcode 11とiOS 13を使用しています。
私はこれがこのウェブサイトに従ってiOS 13まで可能ではなかった(特にUIDを読む)ことはできませんでした: https://gototags.com/blog/Apple-expands-nfc-on-iphone-in--inoios -13 / とこの男: https://www.reddit.com/r/apple/comments/c0gzf0/clearing_up_misunderStands_and/
PHONES NFCリーダーがカードを正しく検出しているが、一意の識別子は常に空またはnilとして返されます。私はペイロードを読むことができますが、iOSには無関係ですが、Androidでこれを行うことができます(カードが不良ではないか奇数ではない)
Appleサンプルプロジェクト: https://developer.apple.com/documentation/corenfc/building_an_nfc_tag-reader_app
_ func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if case let NFCTag.miFare(tag) = tags.first! {
session.connect(to: tags.first!) { (error: Error?) in
let apdu = NFCISO7816APDU(instructionClass: 0, instructionCode: 0xB0, p1Parameter: 0, p2Parameter: 0, data: Data(), expectedResponseLength: 16)
tag.queryNDEFStatus(completionHandler: {(status: NFCNDEFStatus, e: Int, error: Error?) in
debugPrint("\(status) \(e) \(error)")
})
tag.sendMiFareISO7816Command(apdu) { (data, sw1, sw2, error) in
debugPrint(data)
debugPrint(error)
debugPrint(tag.identifier)
debugPrint(String(data: tag.identifier, encoding: .utf8))
}
}
}
}
_
私はこれらの種類のハックを知っています: CorenfcはiOSでUIDを読んでいない
しかし、彼らは閉じられ、過去に短時間でiOS 11にのみ適用されます。
私はあなたがそれがnil
を返すと言ったが、将来の読者を明確にするために:
FeliCaタグではないと仮定すると、検出されたらidentifier
フィールドにあるべきです。
_func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
if case let NFCTag.miFare(tag) = tags.first! {
print(tag.identifier as NSData)
}
}
_
しかし、あなたの場合は空です(下記の編集を参照)。ほとんどのタグでは、APDUがタグのUIDを取得するのは
_ 0xff // Class
0xca // INS
0x00 // P1
0x00 // P2
0x00 // Le
_
そのため、_tag.sendMiFareCommand
_を使ってそのコマンドを手動で送信することができます。
編集:opからの応答、それは空ではありませんでしたが、Swiftの印刷はコンソールに表示されない