NDEFReader: write() 方法
NDEFReader 接口的 write() 方法尝试将 NDEF 消息写入标签,并返回一个 Promise。该 Promise 在消息成功写入标签后解析,或者在遇到硬件或权限错误时拒绝。如果尚未授予“nfc”权限,此方法会触发一个权限提示。
语法
write(message)
write(message, options)
参数
message-
要写入的消息,可以是字符串、
ArrayBuffer、TypedArray、DataView,或记录数组。记录包含以下成员:data可选-
包含要传输的数据,可以是字符串、
ArrayBuffer、TypedArray、DataView,或嵌套记录的数组。 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-
此操作的权限被拒绝,或者
overwrite为false且标签上已存在记录。 NotSupportedError-
没有与 Web NFC 兼容的 NFC 适配器,或者可用的 NFC 适配器不支持消息推送,或者无法建立连接。
NotReadableError-
UA 未被允许访问底层 NFC 适配器(例如,由于用户偏好)。
NetworkError-
传输在开始后失败(例如,标签已从读卡器移除)。
示例
写入文本字符串
以下示例展示了如何将字符串写入 NFC 标签并处理发生的任何错误。
const ndef = new NDEFReader();
ndef
.write("Hello World")
.then(() => {
console.log("Message written.");
})
.catch((error) => {
console.log(`Write failed :-( try again: ${error}.`);
});
写入 URL
以下示例展示了如何将记录对象(如上所述)写入 NFC 标签并处理发生的任何错误。
const ndef = new NDEFReader();
try {
await ndef.write({
records: [{ recordType: "url", data: "http://example.com/" }],
});
} catch {
console.log("Write failed :-( try again.");
}
安排带有超时的写入
有时为写入操作设置时间限制很有用。例如,您要求用户触摸一个标签,但在一定时间内未找到任何标签,然后您将超时。
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 |
浏览器兼容性
加载中…