NDEFReader.write()
安全なコンテキスト用: この機能は一部またはすべての対応しているブラウザーにおいて、安全なコンテキスト (HTTPS) でのみ利用できます。
Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。
write()
は NDEFReader
インターフェイスのプロパティで、タグに NDEF メッセージを書き込むことを試みます。 Promise
を返し、これはタグにメッセージが書き込まれると解決し、ハードウェアや権限のエラーが発生すると拒否されます。このメソッドは、 "nfc" の権限が事前に許可されていない場合は、許可を問い合わせるプロンプトを起動します。
構文
NDEFReader.write(message);
NDEFReader.write(message, options);
引数
message
-
書き込まれるメッセージで、
DOMString
,BufferSource
, レコードの配列の何れかです。レコードには以下のメンバーがあります。data
省略可-
転送されるデータが入ります。文字列、
BufferSource
、ネストしたレコードの配列の何れかです。 encoding
省略可-
文字列で、このレコードのエンコーディングを指定します。
id
省略可-
このレコードの開発者が定義した識別子です。
lang
省略可-
RFC 5646: Tags for Identifying Languages (または 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
で、メッセージがタグに書き込まれたら解決し、ハードウェアまたは権限のエラーが発生した場合は拒否されます。
例外
このメソッドからは例外は発生しません。代わりに返されるプロミスが拒否され、 DOMException
が name
を何れかの一つとして渡されます。
AbortError
-
options
引数で渡されたAbortSignal
によってスキャン操作が中止された。 NotAllowedError
-
この操作の権限が拒否されたか、
overwrite
がfalse
であり、既にタグにそのレコードがあった。 NotSupportedError
-
ウェブ NFC と互換性のある NFC アダプターがない、または利用可能な NFC アダプターがプッシュメッセージに対応していない、または接続が確立できなかった。
NotReadableError
-
UA が接続されている NFC アラプターにアクセスできなかった(例えば、ユーザー設定のため)。
NetworkError
-
開始された後で転送に失敗した(例えば、タグがリーダーから取り外された)。
例
テキスト文字列の書き込み
以下の例では、 DOMString
を 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!");
}
仕様書
Specification |
---|
Web NFC API # dom-ndefreader-write |
ブラウザーの互換性
BCD tables only load in the browser