NDEFReader: write() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

NDEFReader 接口的 write() 方法尝试将 NDEF 消息写入标签,并返回一个 Promise。该 Promise 在消息成功写入标签后解析,或者在遇到硬件或权限错误时拒绝。如果尚未授予“nfc”权限,此方法会触发一个权限提示。

语法

js
write(message)
write(message, options)

参数

message

要写入的消息,可以是字符串、ArrayBufferTypedArrayDataView,或记录数组。记录包含以下成员:

data 可选

包含要传输的数据,可以是字符串、ArrayBufferTypedArrayDataView,或嵌套记录的数组。

encoding 可选

指定记录编码的字符串。

id 可选

为记录定义的标识符。

lang 可选

有效的 BCP 47 语言标签

mediaType 可选

有效的 MIME 类型

recordType

指示 data 中存储的数据类型的字符串。它必须是以下值之一:

"absolute-url"

数据的绝对 URL。

"empty"

NDEFRecord 为空。

"mime"

有效的 MIME 类型

"smart-poster"

根据 NDEF-SMARTPOSTER 规范定义的智能海报。

"text"

根据 NDEF-TEXT 规范定义的文本。

"unknown"(未知)

记录类型未知。

"URL"

根据 NDEF-URI 规范定义的 URL。

options 可选

具有以下属性的对象:

overwrite

一个布尔值,指定是否应覆盖现有记录(如果存在)。

signal 可选

一个 AbortSignal,允许取消当前的写入操作。

返回值

一个 Promise,在消息成功写入标签后解析,或者在遇到硬件或权限错误时拒绝。

异常

此方法不抛出异常;相反,它会拒绝返回的 Promise,并传递一个 name 为以下之一的 DOMException

AbortError

options 参数中传递的 AbortSignal 中止了扫描操作。

NotAllowedError

此操作的权限被拒绝,或者 overwritefalse 且标签上已存在记录。

NotSupportedError

没有与 Web NFC 兼容的 NFC 适配器,或者可用的 NFC 适配器不支持消息推送,或者无法建立连接。

NotReadableError

UA 未被允许访问底层 NFC 适配器(例如,由于用户偏好)。

NetworkError

传输在开始后失败(例如,标签已从读卡器移除)。

示例

写入文本字符串

以下示例展示了如何将字符串写入 NFC 标签并处理发生的任何错误。

js
const ndef = new NDEFReader();
ndef
  .write("Hello World")
  .then(() => {
    console.log("Message written.");
  })
  .catch((error) => {
    console.log(`Write failed :-( try again: ${error}.`);
  });

写入 URL

以下示例展示了如何将记录对象(如上所述)写入 NFC 标签并处理发生的任何错误。

js
const ndef = new NDEFReader();
try {
  await ndef.write({
    records: [{ recordType: "url", data: "http://example.com/" }],
  });
} catch {
  console.log("Write failed :-( try again.");
}

安排带有超时的写入

有时为写入操作设置时间限制很有用。例如,您要求用户触摸一个标签,但在一定时间内未找到任何标签,然后您将超时。

js
const ndef = new NDEFReader();
ndef.onreading = (event) => console.log("We read a tag!");

function write(data, { timeout } = {}) {
  return new Promise((resolve, reject) => {
    const controller = new AbortController();
    controller.signal.onabort = () =>
      reject(new Error("Time is up, bailing out!"));
    setTimeout(() => controller.abort(), timeout);

    ndef.addEventListener(
      "reading",
      (event) => {
        ndef.write(data, { signal: controller.signal }).then(resolve, reject);
      },
      { once: true },
    );
  });
}

await ndef.scan();
try {
  // Let's wait for 5 seconds only.
  await write("Hello World", { timeout: 5_000 });
} catch (err) {
  console.error("Something went wrong", err);
} finally {
  console.log("We wrote to a tag!");
}

规范

规范
Web NFC
# dom-ndefreader-write

浏览器兼容性