iOS - получение идентификатора оборудования NFCTag и сообщения NDEF за один сеанс чтения - PullRequest
0 голосов
/ 16 октября 2019

В настоящее время я сталкиваюсь с проблемой реализации конкретной функции в приложении iOS 13 на основе NFC. При чтении тега я хотел бы получить уникальный идентификатор оборудования и сообщение NDEF за один сеанс. До сих пор я проверял различные примеры проектов, в том числе код, предоставленный Apple, и смог получить интересующую меня информацию, но не во время одного сеанса чтения.

Я упростил следующие фрагменты кода, чтобы лучшесосредоточиться на проблеме (пропущенные проверки ошибок и т. д.).

Использование NFCTagReaderSession для получения уникального идентификатора оборудования:

func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
    let tag = tags.first!

    session.connect(to: tag) { (error: Error?) in
        if case let .miFare(mifareTag) = tag {

            print(mifareTag.identifier as NSData) //this is the info I'm interested in

        }
    }
}

Однако тип полезной нагрузки записи сообщения, по-видимому, толькодоступно в NFCNDEFReaderSession:

func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {

        let tag = tags.first!
        session.connect(to: tag, completionHandler: { (error: Error?) in

            tag.queryNDEFStatus(completionHandler: { (ndefStatus: NFCNDEFStatus, capacity: Int, error: Error?) in


                tag.readNDEF(completionHandler: { (message: NFCNDEFMessage?, error: Error?) in
                    var statusMessage: String
                    if nil != error || nil == message {
                        statusMessage = "Fail to read NDEF from tag"
                    } else {
                        statusMessage = "Found 1 NDEF message"

                        let payload = message.records.first!

                        if let type = String(data: payload.type, encoding: .utf8) {
                            print("type:%@", type) //this is the info I'm interested in
                        }


                    }

                    session.alertMessage = statusMessage
                    session.invalidate()
                })
            })
        })
    }

Как видите, я могу либо получить идентификатор оборудования, используя NFCTagReaderSession, либо тип полезной нагрузки записи сообщения, используя NFCNDEFReaderSession. Я что-то здесь упускаю или действительно нужны две разные сессии чтения, чтобы получить интересующую меня информацию? Заранее спасибо.

...