使用 CoreNFC 检测 ISO/IEC 14443(Mifare Ultralight 或 Classic)NFC 卡

Detect ISO/IEC 14443 (Mifare Ultralight or Classic) NFC Cards with CoreNFC

所以我在 WWDC 上使用以下代码检测到了 Apple Labs 提供的 NFC 卡:

nfcSession = NFCNDEFReaderSession(delegate: self, queue: nil, invalidateAfterFirstRead: false)
nfcSession.begin()

以及委托方法:

func readerSession(_ session: NFCNDEFReaderSession, didInvalidateWithError error: Error) {
    DispatchQueue.main.async {
        print("Error:" + error.localizedDescription)
    }
}

func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
    print("Did detect NDEFs.")
    for message in messages {
        for record in message.records {
            print(record.identifier)
            print(record.payload)
            print(record.type)
            print(record.typeNameFormat)
        }
    }
}

然而,我想检测 ISO/IEC 14443 协议下的 Mifare Ultralight(或经典)卡。

每当我获得扫描视图时,什么也没有发生。错误回调或成功块也不会被调用。有没有办法读取这些卡片?

非常感谢!

你可以看看例如https://github.com/hansemannn/iOS11-NFC-Example or other tutorials (http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios-devices/) 谈论通过 iOS 使用 NFC。 一些观察:您的第一个代码片段显示 NFCISO15693ReaderSession 而不是 NFCNDEFReaderSession.

最重要的是,您需要确保 tags/cards 包含有效的 NDEF 消息。我目前的观察是:

  • 标签上没有 NDEF --> iPhone
  • 上没有操作
  • 标签上的无效 NDEF 需要在您的应用中妥善处理,在最坏的情况下会导致崩溃。

MIFARE Classic 1k 或 4k 芯片早于 ISO/IEC 14443 标准。在 WWDC CoreNFC 演示中,没有明确提到 MIFARE Classic 受 CoreNFC 支持。

支持 MIFARE Ultralight,或任何其他类型 2 标签(例如 NTAG 203)。我认为 MIFARE Classic 的继任者将是 Type 4 (DESFire)。

话虽如此,我可以成功读取 MIFARE Classic 1k 标签,如果所有 16 个扇区密钥 A 和 B 都保留为出厂默认值,并且如果标签包含有效的 NDEF 消息。即使更改了一个密钥,reader 也会中止并显示 readerSessionInvalidationErrorUserCanceled。

根据我的经验,Beta 2 在读取标签时更加可靠。在我的 phone 上,第一次读取总是失败,我必须停止并重新启动 reader 会话。从那时起,它工作正常。使用 beta 1,我经常不得不先重新启动 phone,甚至还要多次 cancel/retry。

编辑:NXP - MIFARE 标签的供应商 - 发布了一个规范,解释了如何在 MIFARE 经典标签中存储 NDEF 标签。我的测试表明,使用 CoreNFC 库可以毫无问题地读取此类标签。 Adafruit 已为 Arduino 发布了一个库,允许根据此规范重新格式化 MIFARE 经典标签。

之前我使用了另一个 NDEF Arduino 库,它使用了不同的方法,不符合规范。有时无论如何都可以读取标签,但不可靠。

结论:请 100% 确保您使用的标签格式符合已发布的规范。如果您无法读取在抽屉中找到的标签,那可能不是 CoreNFC 库的问题。