Я пытаюсь parse
получить данные из отформатированного NFC chip
, но у меня возникает проблема, когда дело доходит до record.type == U
Я использую телефон Android с приложением NXP writer
, чтобы писать свои чипы NFC.
Я получаю все за record.type == T
, но когда я получаю record.type == U
, у меня возникают некоторые трудности.
Идея, которую я нашел в Интернете, заключается в том, что при преобразовании data to hexString
и checking the first 2 numbers
вы можете классифицировать следующие категории, которые может иметь URI.
iOS 11 - Как можно прочитать / проанализировать сообщение NDEF из CoreNFC?
Примеры:
- 0x00 Н / Д. Предварительная подготовка не производится
- 0x01 http://www.
- 0x02 https://www.
- 0x03 http://
- 0x04 https://
- 0x05 тел:
- 0x06 mailto:
- 0x07 ftp: // анонимный: анонимный @
- 0x08 ftp: //ftp.
и т.д.
hexString = "02676f6f676c652e636f6d"
substring = "02"
Затем у нас есть https://www
, и мы добавляем строку из полезной нагрузки, и открываем сафари (или то, что мы хотим сделать).
The problem comes when I want to read a NFC Tag/chip that contains Tel, mailto, geo, sms so far.
The code is 3 digits
006 вместо 2 цифр, как я читаю онлайн. И не только это, если я решу иметь геолокацию, I get 006 which is the same with mailto code
. Конечно, я могу решить эту проблему с помощью большего количества кода, но, поскольку существуют решения, которые проверяют только эти коды, могу ли я что-то сделать или я делаю что-то не так?
Вопросы:
- Есть ли проблема с NXP Writer, и я сталкиваюсь с этой проблемой?
- Кодировка NFC была изменена?
- Правильна ли моя логика?
Вот мой код:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
session.invalidate()
for message in messages{
for record in message.records{
guard record.payload.count > 0 else {
print("Record payload doesn't contain any data in the memory")
session.invalidate()
return
}
guard let NFCTypeFromTag = String(data: record.type, encoding: .utf8) else{
print("Unable to detect the Type")
session.invalidate()
return
}
guard let nfcTypeInput = NFCType(rawValue: NFCTypeFromTag) else {
print("nfc enum problem")
session.invalidate()
return
}
switch nfcTypeInput{
case .T:
guard let NFCStringFromPayload = String(data: record.payload.advanced(by: 3), encoding: .utf8) else {
return
}
NFCString = NFCStringFromPayload
case .U:
guard let NFCStringFromPayload = String(data: record.payload, encoding: .utf8) else{
print("Error: Unable to convert record.payload to String")
return
}
let hexString = record.payload.hexEncodedString()
let indexEndFromHexString = hexString.index(hexString.startIndex, offsetBy: 2)
let substring = hexString[hexString.startIndex ..< indexEndFromHexString]
print("NFCString : \(NFCStringFromPayload)")
print("HexString : \(hexString)")
print("Substring : \(substring)")
if substring == "00"{
let indexEndOfHexStringCase00 = hexString.index(hexString.startIndex, offsetBy: 3)
let substringCase00 = hexString[hexString.startIndex..<indexEndOfHexStringCase00]
if substringCase00 == "005" {
print("Tel:")
}else if substringCase00 == "006"{
print("mailto:")
}else if substringCase00 == "007" {
print("sms")
}
}else if substring == "01"{
print("http://www")
}else if substring == "02"{
print("https://www")
}
NFCString = NFCStringFromPayload
case .Sp:
break
}
NFCArray.append(NFCString!)
tableView.reloadData()
print("NFC String : \(NFCString)")
}
}
У Apple ужасная документация по CoreNFC.
Есть ли подобное решение, которое кто-то реализовал.
Заранее спасибо.