NDEFReader:write() 方法
NDEFReader
接口的 write()
方法尝试将 NDEF 消息写入标签,并返回一个Promise
,该 Promise 在消息写入标签后解析,或在遇到硬件或权限错误时拒绝。如果之前没有授予“nfc”权限,此方法将触发权限提示。
语法
write(message)
write(message, options)
参数
message
-
要写入的消息,可以是字符串、
ArrayBuffer
、TypedArray
、DataView
或记录数组。记录具有以下成员data
可选-
包含要传输的数据,可以是字符串、
ArrayBuffer
、TypedArray
、DataView
或嵌套记录数组 encoding
可选-
指定记录编码的字符串。
id
可选-
开发人员为记录定义的标识符。
lang
可选-
根据RFC 5646:标识语言的标签(也称为 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 在消息写入标签后解析,或在遇到硬件或权限错误时拒绝。
异常
此方法不会抛出异常;而是拒绝返回的 promise,并传递一个DOMException
,其 name
是以下值之一
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 ctlr = new AbortController();
ctlr.signal.onabort = () => reject("Time is up, bailing out!");
setTimeout(() => ctlr.abort(), timeout);
ndef.addEventListener(
"reading",
(event) => {
ndef.write(data, { signal: ctlr.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 API # dom-ndefreader-write |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。