-1

我正在尝试为 iOS 应用程序实现后台 NFC 标签读取。我正在使用的 NFC 标签对必须写入的格式有特定要求 - 具体来说,只有第二条记录可以是 URI,并且长度必须为 56 个字符。

我已经构建并编写了以下 NDEF 消息:

        let message = NFCNDEFMessage(records: [
            NFCNDEFPayload(
                format: .nfcExternal,
                type: "-- omitted --".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "-- omitted --".data(using: .utf8)!
            ),
            NFCNDEFPayload(
                format: .nfcWellKnown,
                type: "U".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "https://apple.com?                                      ".data(using: .utf8)!
            ),
            NFCNDEFPayload(
                format: .nfcWellKnown,
                type: "T".data(using: .utf8)!,
                identifier: "".data(using: .utf8)!,
                payload: "-- omitted --".data(using: .utf8)!
            )
        ])

现在,当我将 iOS 设备与手机接触时,我会收到一条提示信息(括号中的原始内容,假设先是英文翻译):

检测到 NFC 标记(NFC 标记 GEDETECTEERD)

未找到可用数据(Green bruikbare gegevens gevonden)

我尝试用?_______...通用链接或通用链接替换空格,但我总是得到相同的响应。当我尝试读取其他未写入的 NFC 标签时,我没有收到提示,因此我知道新消息正在激活后台读取,但我不知道为什么它无法读取。

我唯一的猜测是iOS没有解码.utf8字节数组,但我不知道如何将消息存储/编码到NFC标签

4

2 回答 2

0

所以https://developer.apple.com/documentation/corenfc/adding_support_for_background_tag_reading

注意
背景标记读取不支持自定义 URL 方案。请改用通用链接。

NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "".data(using: .utf8)!,
   payload: "https://apple.com?                                      ".data(using: .utf8)!
),

我认为您没有使用链接文档中受支持的 URL 架构之一,您使用的是它表示不支持的“自定义 URL 方案”。

使用帮助功能NFCNDEFPayload.wellKnownTypeURIPayload,这可能会将您的字符串解码为受支持的 URL 方案。

文档不清楚,并引用了 URI 的 NDEF 规范,该规范位于https://github.com/haldean/ndef/blob/master/docs/NFCForum-TS-RTD_URI_1.0.pdf

所以我的猜测是,要进行更多的手动创建,NFCNDEFPayload您需要将其正确格式化为

NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "4".data(using: .utf8)!,
   payload: "apple.com?".data(using: .utf8)!
),

与前缀4的十进制代码一样https://

于 2020-12-11T12:38:33.107 回答
0

我更换了:

NFCNDEFPayload(
   format: .nfcWellKnown,
   type: "U".data(using: .utf8)!,
   identifier: "".data(using: .utf8)!,
   payload: "https://apple.com?                                      ".data(using: .utf8)!
),

和:

NFCNDEFPayload.wellKnownTypeURIPayload(string: "https://apple.com?_____________________________________________")!

我不知道为什么

  1. 我需要更长的字符串(63 个字符)
  2. 为什么那个字符串仍然只有 56 个字节
  3. 构造函数有什么不同
  4. 为什么我确实需要下划线,因为空格没有注册为背景标签

也许其他人还可以解释这个解决方案。但是,它有效!

于 2020-12-11T12:10:08.963 回答