【问题标题】:Write URL on NFC tag in correct format in Swift在 Swift 中以正确的格式在 NFC 标签上写入 URL
【发布时间】:2021-09-07 17:44:29
【问题描述】:

我正在构建一个 NFC 读写应用程序。我使用此代码在标签上编写 URL:

private func writeTag(_ tag: NFCNDEFTag, for session: NFCReaderSession?) {
    guard let payload = "\u{02}en\(self.url ?? "")".data(using: .utf8) else {
        session!.invalidate()
        return
    }
    let record = NFCNDEFPayload(format: .nfcWellKnown, type: Data(), identifier: Data(), payload: payload)
    let myMessage = NFCNDEFMessage.init(records: [record])
    tag.writeNDEF(myMessage) { (error) in
        if error != nil {
            session?.invalidate(errorMessage: "Couldn't write tag")
        } else {
            session?.alertMessage = "Tag is written successfully"
            session!.invalidate()
        }
    }
}

文笔不错。但是,问题在于有效负载 (URL) 格式。例如,当我使用上面的代码将“https://github.com”写为 URL,然后使用另一个 NFC 应用程序读取我刚刚编写的内容时,我会得到“enhttps://github.co”。所以我确定问题出在这一行:

let payload = "\u{02}en\(self.url ?? "")".data(using: .utf8)

我试过改成:

let payload = (self.url ?? "").data(using: .utf8)

但是,当我再次从另一个应用程序读取我刚刚编写的标签时,我得到的是“https://github.co”而不是“https://github.com”。

我应该如何将我的 URL 转换为数据以使其正常工作?

感谢任何帮助!

【问题讨论】:

  • 提示:NFCNDEFPayload.wellKnownTypeURIPayload

标签: ios swift nfc


【解决方案1】:

来源可以在:How To Make Your Swift App Work With NFC Tags in iOS 13

根据 Apple 的 NFCReaderSession 文档:

您不创建此类的实例。相反,您创建并使用 NFCNDEFReaderSession 或 NFCTagReaderSession 的实例。一次只能在系统中激活一个任何类型的阅读器会话。系统将额外的会话放入队列中,并以先进先出的顺序进行处理。

所以,我真的不确定您是如何创建NFCReaderSession 的实例并调用writeTag 的。但实际上,您创建 payload 的方式似乎是您的代码出了问题。

正确定义包含 URL 的有效负载:

let uriPayloadFromURL = NFCNDEFPayload.wellKnownTypeURIPayload(
           url: URL(string: "www.github.com")!
        )!

通过创建NFCNDEFReaderSession 的实例,并按如下方式实现readerSession,您将获得您想要实现的目标。

func readerSession(_ session: NFCNDEFReaderSession, didDetect tags: [NFCNDEFTag]) {
    
    let uriPayloadFromURL = NFCNDEFPayload.wellKnownTypeURIPayload(
        url: URL(string: "www.github.com")!
    )!
    
    guard tags.count == 1 else {
        session.invalidate(errorMessage: "Can not write to more than one tag.")
        return
    }
    let currentTag = tags.first!
    
    session.connect(to: currentTag) { error in
        
        guard error == nil else {
            session.invalidate(errorMessage: "Could not connect to tag.")
            return
        }
        
        currentTag.queryNDEFStatus { status, capacity, error in
            guard error == nil else {
                session.invalidate(errorMessage: "Could not query status of tag.")
                return
            }
            
            switch status {
            case .notSupported: session.invalidate(errorMessage: "Tag is not supported.")
            case .readOnly:     session.invalidate(errorMessage: "Tag is only readable.")
            case .readWrite:
                let messge = NFCNDEFMessage.init(records: [uriPayloadFromURL])
                currentTag.writeNDEF(messge) { error in
                    if error != nil {
                        session.invalidate(errorMessage: "Failed to write message.")
                    } else {
                        session.alertMessage = "Successfully configured tag."
                        session.invalidate()
                    }
                }
                
            @unknown default:   session.invalidate(errorMessage: "Unknown status of tag.")
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多