3

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

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

非常感谢!

4

2 回答 2

9

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 消息。即使更改了一个键,阅读器也会以 readerSessionInvalidationErrorUserCanceled 中止。

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

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

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

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

于 2017-06-26T19:02:18.133 回答
2

您可以查看例如https://github.com/hansemannn/iOS11-NFC-Example或其他教程(http://jamesonquave.com/blog/core-nfc-tutorial-for-nfc-on-ios- devices/ ) 讨论在 iOS 中使用 NFC。一些观察:您的第一个代码片段显示NFCISO15693ReaderSession而不是NFCNDEFReaderSession.

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

  • 标签上没有 NDEF --> iPhone 上没有操作
  • 标签上的无效 NDEF 需要在您的应用程序中正确处理,在最坏的情况下会导致崩溃。
于 2017-06-16T06:38:45.607 回答