ios - NFC CORE iOS:在同一个会话中读取NDEF、修改数据和WriteNDEF
问题描述
在我的应用程序中,我想从NFC Tag接收数据,修改此数据并将其写回 Tag。 NFC 协议有 5 个阶段要做:
- 可用
查询状态
读取NDEF
- 写NDEF
- 写锁
当我在阅读后修改文本有效负载时,此修改无法通过 WriteNDEF(myMessage) 看到,并且在标签中写入了我在 QueryStatus 阶段初始化的消息。
重要的字符串 08、18 和 50
在使用字符串 50 中的命令后,我已修改并打包到消息有效负载,但在标签中写入了另一个字符串 08 或 18。
func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
let tag = tags.first!
var password: UInt16 = 0
var mess: String = ""
var ToSend: String = "http://" //somehttp
var textPayload = NFCNDEFPayload.wellKnownTypeURIPayload(string: ToSend)
print("Payload -1 ->\(textPayload)")
//08// var myMessage = NFCNDEFMessage(records: [textPayload!]) //When session was finished, writed this one
print("Packed! -1 ->\(myMessage)")
// 3
session.connect(to: tag) { (error: Error?) in
if error != nil {
session.restartPolling()
}
}
// 4
tag.queryNDEFStatus() { (status: NFCNDEFStatus, capacity: Int, error: Error?) in
//18// // myMessage = NFCNDEFMessage(records: [textPayload!]) //or this one, if it wiil be here
if error != nil {
session.invalidate(errorMessage: "Fail to determine NDEF status. Please try again.")
return
}
if status == .readOnly {
session.invalidate(errorMessage: "Tag isnt writable")
} else if status == .readWrite {
// 5
print ("READ-WRITE!")
} else {
session.invalidate(errorMessage: "Isnt NDEF.")
}
} //tag.queryNDEFStatus
print("before read")
tag.readNDEF(completionHandler: { (message: NFCNDEFMessage?, error: Error?) in
print("inside read")
var statusMessage: String
if nil != error || nil == message {
statusMessage = "Fail to read NDEF from tag"
print(statusMessage)
} else {
statusMessage = "Found 1 NDEF message"
print(statusMessage)
let payload = message!.records.first
mess = String(data: payload!.payload.advanced(by: 1), encoding: .ascii)!
//some modification of readed text
//and assignment to String toSend
textPayload = NFCNDEFPayload.wellKnownTypeURIPayload(string: ToSend)
// print("ToSend -2: \(ToSend)")
print("PayLoad -2 ->\(textPayload)")
//50// myMessage = NFCNDEFMessage(records: [textPayload!]) // BUT NOT THIS ONE !! :(
print("Packed! -2 -> \(myMessage)")
//session.alertMessage = statusMessage
}
}) //tag.readNDEF
print("before write")
tag.writeNDEF(myMessage) { (error: Error?) in
if error != nil {
session.invalidate(errorMessage: "Update tag failed. Please try again.")
print("Update tag failed. Please try again.")
} else {
print("Packed! -3 -> \(myMessage)")
session.alertMessage = "Good Job-s!"
print ("Good Job-s!")
// 6
session.invalidate()
}
} //tag.writeNDEF
}
}
解决方案
推荐阅读
- javascript - 从 node.js 中的消息队列中读取消息
- recursion - Tree InOrder 递归方法说明
- flutter - 扑向孩子们
- ios - 在 UIImagePickerController 中禁用或启用捕获按钮
- reactjs - React 在开发中使用 API,部署后失败
- r - Group_by 给出错误“没有适用于 'group_by_' 的方法应用于“列表”类的对象
- javascript - 反应 useState 表现非常糟糕
- django - ModelForm 没有生成任何表单
- php - 看起来您尝试在配置的目录之外加载模板 (../includeFiles/header.html.twig) Symfony
- json - Is it possible to iterate over a json object having `\n` and \`` characters in typescript?