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

时间:2017-06-15 16:46:23

标签: ios swift nfc mifare core-nfc

所以我在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(或经典)卡。

每当我获得扫描视图时,都没有任何反应。也不会调用错误回调或成功块。有没有办法读这张卡?

非常感谢!

2 个答案:

答案 0 :(得分:5)

MIFARE Classic 1k或4k芯片早于ISO / IEC 14443标准。在WWDC CoreNFC演示文稿中,CoreNFC未明确提及MIFARE Classic。

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

话虽如此,我可以成功阅读MIFARE Classic 1k标签,如果所有16个扇区密钥A& B都保留为出厂默认设置,并且标签包含有效的NDEF消息。如果更改了一个键,则读取器将使用readerSessionInvalidationErrorUserCanceled中止。

根据我的经验,在阅读标签时,Beta 2更可靠。在我的手机上,第一次读取总是失败,我必须停止并重新启动阅读器会话。从那时起,它工作正常。对于beta 1,我经常不得不首先重启手机,甚至还要多次取消/重试。

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

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

总之:100%确保使用根据已发布规范格式化的标记。如果您无法读取在抽屉中找到的标签,则可能不是CoreNFC库的错误。

答案 1 :(得分:2)

您可以查看例如关于在iOS上使用NFC的https://github.com/hansemannn/iOS11-NFC-Example或其他教程(http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios-devices/)。 一些观察结果:您的第一个代码段显示yAxes : [ { type: 'time', unit: 'minute', tooltipFormat: 'H:mm', time : { displayFormats: { hour: 'H:mm' } } }] 而不是NFCISO15693ReaderSession

最重要的是,您需要确保您的标签/卡包含有效的NDEF消息。到目前为止我的观察是:

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