NFC (Near Field Communication) 近場通訊是高頻 (13.56 MHz) 短距離無線通訊技術,只要距離 5-10 公分內 Web NFC 就能夠讀取和寫入 NFC 標籤,傳輸速率高達 424 kbit/s。
目前 Web NFC 只支援 NDEF,尚不支援 ISO-DEP、NFC-A/B、NFC-F、HCE。
Demo 站台如下,只會示範讀取功能,因為不太確定真的執行寫入悠遊卡會不會壞掉 Orz
https://linyencheng.github.io/pwa-web-nfc/
Web App 會透過 Page Visibility API 來偵測目前網站是否在 "可見" 的狀態,在可見狀態下才能夠執行掃描讀取或寫入。
當用戶成功使用其設備掃描 NFC 標籤時,瀏覽器會使用震動來提示。
Web NFC 示意圖(圖片來源: https://web-dev)
使用 Web NFC 的情境包括:
if ("NDEFReader" in window) {
// 支援
const nfcPermissionStatus = await navigator.permissions.query({
name: "nfc",
});
if (nfcPermissionStatus.state === "granted") {
// 有開啟權限
} else {
// 未開啟權限
}
}
// 讀
async function readTag() {
try {
const ndef = new NDEFReader();
await ndef.scan();
ndef.addEventListener("readingerror", () => {
log("讀取錯誤");
});
ndef.addEventListener("reading", ({ message, serialNumber }) => {
log(`> Serial Number: ${serialNumber}`);
log(`> Records:(${message.records.length})`);
});
} catch (error) {
log("錯誤" + error);
}
}
// 寫
async function writeTag() {
try {
const ndef = new NDEFReader();
await ndef.write("Hello world!", { overwrite: false });
await ndef.write({
records: [
{ recordType: "url", data: "https://w3c.github.io/web-nfc/" },
{ recordType: "url", data: "https://web.dev/nfc/" },
],
});
} catch (error) {
log("錯誤" + error);
}
}
for (const record of message.records) {
console.log("Record type: " + record.recordType);
console.log("MIME type: " + record.mediaType);
console.log("Record id: " + record.id);
switch (record.recordType) {
case "text":
break;
case "url":
break;
default:
}
}
AbortController
中的 signal 當成參數送進去 scan()、write() 中可以隨時終止目前的動作。const abortController = new AbortController();
abortController.signal.onabort = (event) => {};
const ndef = new NDEFReader();
await ndef.scan({ signal: abortController.signal });
await ndef.write("Hello world", { signal: abortController.signal });
function abortAction(event) {
abortController.abort();
}
abortAction();