在 Android 版 Google Chrome 與 NFC 裝置互動

現在可以讀取及寫入 NFC 標記。

François Beaufort
François Beaufort

什麼是 Web NFC?

NFC 是指近距離無線通訊 (近距離無線通訊) 為 13.56 MHz 的短距無線技術,可在距離超過 10 公分的距離與裝置之間進行通訊,傳輸速率最高可達 424 kbit/秒。

Web NFC 可讓網站在靠近使用者的裝置 (通常是 5 到 10 公分、2 到 4 英寸) 的附近時,讀取及寫入 NFC 標記。目前的範圍僅限於 NFC 資料交換格式 (NDEF),這是適用於不同標記格式的輕量二進位訊息格式。

手機支援 NFC 標記以交換資料
NFC 作業圖表

建議用途

Web NFC 只適用於 NDEF,因為讀取和寫入 NDEF 資料的安全性屬性較容易量化。不支援低階 I/O 作業 (例如 ISO-DEP、NFC-A/B、NFC-F)、點對點通訊模式和主機卡模擬 (HCE)。

以下列舉一些可能使用網路 NFC 的網站:

  • 當使用者將裝置觸碰到展覽附近的 NFC 卡片時,博物館和藝廊可以顯示顯示器的其他相關資訊。
  • 庫存管理網站可以讀取或寫入容器上的 NFC 標記資料,以更新其內容的資訊。
  • 會議網站可以在活動期間使用此功能掃描 NFC 標記,並確保已鎖定,以免對其中輸入的資訊進一步變更。
  • 網站可以利用這個 API 分享裝置或服務佈建情境所需的初始密鑰,以及在作業模式下部署設定資料。
使用手機掃描多個 NFC 標記
NFC 商品目錄管理圖解

目前狀態

步驟 狀態
1. 建立說明 完成
2. 建立規格的初始草稿 完成
3. 收集意見回饋並改進設計 完成
4. 來源試用 完成
5.啟動 完成

使用網路 NFC

功能偵測

硬體的功能偵測與您可能習慣的功能不同。出現 NDEFReader 表示瀏覽器支援 Web NFC,但不知道所需硬體是否存在。具體來說,如果硬體遺失,就會拒絕特定呼叫傳回的承諾。我們會在描述 NDEFReader 時提供詳細資訊。

if ('NDEFReader' in window) { /* Scan and write NFC tags */ }

術語

NFC 標記是被動 NFC 裝置,這指的是在鄰近使用中的 NFC 裝置 (例如手機) 時,採用磁力感應技術。NFC 標記有多種形式和時尚,例如貼圖、信用卡、手臂手腕等。

透明 NFC 標記的相片
透明 NFC 標記

NDEFReader 物件是 Web NFC 中的進入點,提供可在鄰近 NDEF 標記時執行讀取和/或寫入動作的功能。NDEFReader 中的 NDEF 代表 NFC 資料交換格式,這是 NFC 論壇標準化的輕量二進制訊息格式。

NDEFReader 物件是用來處理來自 NFC 標記的 NDEF 訊息,以及將 NDEF 訊息寫入範圍內的 NFC 標記。

支援 NDEF 的 NFC 標記就像是事後筆記。任何人都能讀取,除非它是唯讀狀態,否則任何人都能寫入。其中包含單一 NDEF 訊息,其中封裝一或多筆 NDEF 記錄。每筆 NDEF 記錄都是二進位結構,內含資料酬載和相關類型資訊。Web NFC 支援下列 NFC 論壇標準化記錄類型:空白、文字、網址、智慧型海報、MIME 類型、絕對網址、外部類型、不明和本機類型。

NDEF 訊息圖表
NDEF 訊息圖表

掃描 NFC 標記

如要掃描 NFC 標記,請先將新的 NDEFReader 物件例項化。呼叫 scan() 會傳回承諾。如果先前未授予存取權,系統可能會提示使用者。只要符合下列所有條件,承諾會就能解決:

  • 只有在回應使用者手勢 (例如觸控手勢或滑鼠點選) 時才會呼叫此方法。
  • 使用者已允許網站與 NFC 裝置互動。
  • 使用者的手機支援 NFC 功能。
  • 使用者啟用了手機的 NFC 功能。

解析後,您可以透過事件監聽器訂閱 reading 事件,以使用傳入的 NDEF 訊息。您也應訂閱 readingerror 事件,即可在鄰近不相容 NFC 標記時收到通知。

const ndef = new NDEFReader();
ndef.scan().then(() => {
  console.log("Scan started successfully.");
  ndef.onreadingerror = () => {
    console.log("Cannot read data from the NFC tag. Try another one?");
  };
  ndef.onreading = event => {
    console.log("NDEF message read.");
  };
}).catch(error => {
  console.log(`Error! Scan failed to start: ${error}.`);
});

當 NFC 標記位於鄰近位置時,系統會觸發 NDEFReadingEvent 事件。其中包含兩項專屬的屬性:

  • serialNumber 代表裝置的序號 (例如 00-11-22-33-44-55-66);如果沒有可用字串,則為空字串。
  • message 代表儲存在 NFC 標記中的 NDEF 訊息。

如要讀取 NDEF 訊息的內容,請對 message.records 執行迴圈,並根據其 recordType 適當處理其 data 成員。data 成員會以 DataView 的形式公開,因為可以處理資料採用 UTF-16 編碼的情況。

ndef.onreading = event => {
  const message = event.message;
  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":
        // TODO: Read text record with record data, lang, and encoding.
        break;
      case "url":
        // TODO: Read URL record with record data.
        break;
      default:
        // TODO: Handle other records with record data.
    }
  }
};

寫入 NFC 標記

如要編寫 NFC 標記,請先將新的 NDEFReader 物件例項化。呼叫 write() 會傳回承諾。如果先前未授予存取權,系統可能會提示使用者。此時,NDEF 訊息已「準備就緒」,且如果符合下列所有條件,則 promise 將可解決問題:

  • 只有在回應使用者手勢 (例如觸控手勢或滑鼠點選) 時才會呼叫此方法。
  • 使用者已允許網站與 NFC 裝置互動。
  • 使用者的手機支援 NFC 功能。
  • 使用者啟用了手機的 NFC 功能。
  • 使用者輕觸了 NFC 標記,系統已成功寫入 NDEF 訊息。

如要將文字寫入 NFC 標記,請將字串傳遞至 write() 方法。

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

如要將網址記錄寫入 NFC 標記,請將代表 NDEF 訊息的字典傳送至 write()。在以下範例中,NDEF 訊息是具有 records 索引鍵的字典。其值是記錄陣列。在這種情況下,網址記錄定義為物件,金鑰為 recordType 金鑰設為 "url",金鑰則設為網址字串。data

const ndef = new NDEFReader();
ndef.write({
  records: [{ recordType: "url", data: "https://w3c.github.io/web-nfc/" }]
}).then(() => {
  console.log("Message written.");
}).catch(error => {
  console.log(`Write failed :-( try again: ${error}.`);
});

您也可以將多筆記錄寫入 NFC 標記。

const ndef = new NDEFReader();
ndef.write({ records: [
    { recordType: "url", data: "https://w3c.github.io/web-nfc/" },
    { recordType: "url", data: "https://web.dev/nfc/" }
]}).then(() => {
  console.log("Message written.");
}).catch(error => {
  console.log(`Write failed :-( try again: ${error}.`);
});

如果 NFC 標記包含不應覆寫的 NDEF 訊息,請在傳遞至 write() 方法的選項中,將 overwrite 屬性設為 false。在這種情況下,如果 NDEF 訊息已儲存在 NFC 標記中,傳回的承諾會遭到拒絕。

const ndef = new NDEFReader();
ndef.write("Writing data on an empty NFC tag is fun!", { overwrite: false })
.then(() => {
  console.log("Message written.");
}).catch(error => {
  console.log(`Write failed :-( try again: ${error}.`);
});

將 NFC 標記設為唯讀

為避免惡意使用者覆寫 NFC 標記的內容,您可以將 NFC 標記設為永久唯讀狀態。這項作業是單向程序,無法復原。NFC 標記設為唯讀後,就無法再寫入。

如要將 NFC 標記設為唯讀,請先例項化新的 NDEFReader 物件。呼叫 makeReadOnly() 會傳回承諾。如果先前未授予存取權,系統可能會提示使用者。如符合下列所有條件,該項承諾就會解決問題:

  • 只有在回應使用者手勢 (例如觸控手勢或滑鼠點選) 時才會呼叫此方法。
  • 使用者已允許網站與 NFC 裝置互動。
  • 使用者的手機支援 NFC 功能。
  • 使用者啟用了手機的 NFC 功能。
  • 使用者輕觸了 NFC 標記,系統已成功將 NFC 標記設為唯讀。
const ndef = new NDEFReader();
ndef.makeReadOnly()
.then(() => {
  console.log("NFC tag has been made permanently read-only.");
}).catch(error => {
  console.log(`Operation failed: ${error}`);
});

以下說明如何在寫入 NFC 標記後將其設為永久唯讀狀態。

const ndef = new NDEFReader();
try {
  await ndef.write("Hello world");
  console.log("Message written.");
  await ndef.makeReadOnly();
  console.log("NFC tag has been made permanently read-only after writing to it.");
} catch (error) {
  console.log(`Operation failed: ${error}`);
}

由於 makeReadOnly() 適用於 Chrome 100 以上版本,請檢查以下程式碼是否支援這項功能:

if ("NDEFReader" in window && "makeReadOnly" in NDEFReader.prototype) {
  // makeReadOnly() is supported.
}

安全性和權限

Chrome 團隊在設計及實作 Web NFC 時,秉持「控管強大的網路平台功能存取權」一文中定義的核心原則,這些原則包括使用者控制項、資訊公開和人體工學。

由於 NFC 能夠擴充可能適用於惡意網站的資訊領域,因此 NFC 的可用性受到限制,目的是盡可能讓使用者瞭解及控管 NFC 使用情形。

網站上的網路 NFC 提示螢幕截圖
網路 NFC 使用者提示

網路 NFC 僅適用於頂層頁框和安全瀏覽結構定義 (僅限 HTTPS)。來源在處理使用者手勢 (例如按鈕點擊) 時,必須先要求 "nfc" 權限。如果先前未授予存取權,NDEFReader scan()write()makeReadOnly() 方法會觸發使用者提示。

  document.querySelector("#scanButton").onclick = async () => {
    const ndef = new NDEFReader();
    // Prompt user to allow website to interact with NFC devices.
    await ndef.scan();
    ndef.onreading = event => {
      // TODO: Handle incoming NDEF messages.
    };
  };

系統會結合使用者啟動權限提示,以及將裝置透過目標 NFC 標記實際移動時的實際移動情形,結合其他檔案和裝置存取權 API 中的選擇工具模式。

如要執行掃描或寫入作業,當使用者用裝置輕觸 NFC 標記時,系統必須顯示該網頁。瀏覽器會利用觸覺回饋表示輕觸動作。如果螢幕關閉或裝置遭到鎖定,就無法存取 NFC 無線電。針對不可見的網頁,接收及推送 NFC 內容會遭到停權,並在重新顯示網頁時恢復運作。

有了 Page Visibility API,就能在文件瀏覽權限變更時進行追蹤。

document.onvisibilitychange = event => {
  if (document.hidden) {
    // All NFC operations are automatically suspended when document is hidden.
  } else {
    // All NFC operations are resumed, if needed.
  }
};

教戰手冊

以下提供幾個程式碼範例,協助您快速上手。

檢查權限

Permissions API 可讓您檢查是否已授予 "nfc" 權限。這個範例說明如何在先前授予存取權時,如何在沒有使用者互動的情況下掃描 NFC 標記,或是顯示按鈕以其他方式。請注意,由於 NFC 標記在寫入時使用了相同的權限,因此相同的機制也適用。

const ndef = new NDEFReader();

async function startScanning() {
  await ndef.scan();
  ndef.onreading = event => {
    /* handle NDEF messages */
  };
}

const nfcPermissionStatus = await navigator.permissions.query({ name: "nfc" });
if (nfcPermissionStatus.state === "granted") {
  // NFC access was previously granted, so we can start NFC scanning now.
  startScanning();
} else {
  // Show a "scan" button.
  document.querySelector("#scanButton").style.display = "block";
  document.querySelector("#scanButton").onclick = event => {
    // Prompt user to allow UA to send and receive info when they tap NFC devices.
    startScanning();
  };
}

取消 NFC 作業

使用 AbortController 原始版本可讓您輕鬆取消 NFC 作業。以下範例說明如何透過 NDEFReader scan()makeReadOnly()write() 方法的選項傳遞 AbortControllersignal,並同時取消這兩項 NFC 作業。

const abortController = new AbortController();
abortController.signal.onabort = event => {
  // All NFC operations have been aborted.
};

const ndef = new NDEFReader();
await ndef.scan({ signal: abortController.signal });

await ndef.write("Hello world", { signal: abortController.signal });
await ndef.makeReadOnly({ signal: abortController.signal });

document.querySelector("#abortButton").onclick = event => {
  abortController.abort();
};

寫入後讀取

先搭配使用 write()scan() 搭配 AbortController 基本功能,就能在撰寫訊息後讀取 NFC 標記。以下範例說明如何將簡訊寫入 NFC 標記,以及如何讀取 NFC 標記中的新訊息。會在三秒後停止掃描。

// Waiting for user to tap NFC tag to write to it...
const ndef = new NDEFReader();
await ndef.write("Hello world");
// Success! Message has been written.

// Now scanning for 3 seconds...
const abortController = new AbortController();
await ndef.scan({ signal: abortController.signal });
const message = await new Promise((resolve) => {
  ndef.onreading = (event) => resolve(event.message);
});
// Success! Message has been read.

await new Promise((r) => setTimeout(r, 3000));
abortController.abort();
// Scanning is now stopped.

讀取及寫入文字記錄

您可以使用記錄 encoding 屬性將文字記錄data解碼。TextDecoder請注意,文字記錄的語言可透過其 lang 屬性取得。

function readTextRecord(record) {
  console.assert(record.recordType === "text");
  const textDecoder = new TextDecoder(record.encoding);
  console.log(`Text: ${textDecoder.decode(record.data)} (${record.lang})`);
}

如要編寫簡單的文字記錄,請將字串傳遞至 NDEFReader write() 方法。

const ndef = new NDEFReader();
await ndef.write("Hello World");

文字記錄預設為 UTF-8,並假設目前文件的語言。但如要建立自訂 NDEF 記錄,您可以使用完整語法來指定 encodinglang 這兩項屬性。

function a2utf16(string) {
  let result = new Uint16Array(string.length);
  for (let i = 0; i < string.length; i++) {
    result[i] = string.codePointAt(i);
  }
  return result;
}

const textRecord = {
  recordType: "text",
  lang: "fr",
  encoding: "utf-16",
  data: a2utf16("Bonjour, François !")
};

const ndef = new NDEFReader();
await ndef.write({ records: [textRecord] });

讀取及寫入網址記錄

使用 TextDecoder 解碼記錄的 data

function readUrlRecord(record) {
  console.assert(record.recordType === "url");
  const textDecoder = new TextDecoder();
  console.log(`URL: ${textDecoder.decode(record.data)}`);
}

如要寫入網址記錄,請將 NDEF 訊息字典傳遞至 NDEFReader write() 方法。NDEF 訊息包含的網址記錄定義為物件,其 recordType 鍵設定為 "url"data 鍵則設為網址字串。

const urlRecord = {
  recordType: "url",
  data:"https://w3c.github.io/web-nfc/"
};

const ndef = new NDEFReader();
await ndef.write({ records: [urlRecord] });

讀取及寫入 MIME 類型記錄

MIME 類型記錄的 mediaType 屬性代表 NDEF 記錄酬載的 MIME 類型,以便系統正確解碼 data。舉例來說,使用 JSON.parse 將 JSON 文字和 Image 元素解碼,以便將圖片資料解碼。

function readMimeRecord(record) {
  console.assert(record.recordType === "mime");
  if (record.mediaType === "application/json") {
    const textDecoder = new TextDecoder();
    console.log(`JSON: ${JSON.parse(decoder.decode(record.data))}`);
  }
  else if (record.mediaType.startsWith('image/')) {
    const blob = new Blob([record.data], { type: record.mediaType });
    const img = new Image();
    img.src = URL.createObjectURL(blob);
    document.body.appendChild(img);
  }
  else {
    // TODO: Handle other MIME types.
  }
}

如要寫入 MIME 類型記錄,請將 NDEF 訊息字典傳遞至 NDEFReader write() 方法。NDEF 訊息內含的 MIME 類型記錄定義為一個物件,並具有 recordType 金鑰設為 "mime"、將 mediaType 金鑰設定為內容的實際 MIME 類型,以及 data 金鑰設為可以是 ArrayBuffer 或提供對 ArrayBuffer 的檢視畫面 (例如 Uint8ArrayDataView)。

const encoder = new TextEncoder();
const data = {
  firstname: "François",
  lastname: "Beaufort"
};
const jsonRecord = {
  recordType: "mime",
  mediaType: "application/json",
  data: encoder.encode(JSON.stringify(data))
};

const imageRecord = {
  recordType: "mime",
  mediaType: "image/png",
  data: await (await fetch("icon1.png")).arrayBuffer()
};

const ndef = new NDEFReader();
await ndef.write({ records: [jsonRecord, imageRecord] });

讀取及寫入絕對網址記錄

絕對網址記錄 data 可以使用簡單的 TextDecoder 進行解碼。

function readAbsoluteUrlRecord(record) {
  console.assert(record.recordType === "absolute-url");
  const textDecoder = new TextDecoder();
  console.log(`Absolute URL: ${textDecoder.decode(record.data)}`);
}

如要寫入絕對網址記錄,請將 NDEF 訊息字典傳遞至 NDEFReader write() 方法。NDEF 訊息內含的絕對網址記錄會定義為一個物件,其 recordType 金鑰設定為 "absolute-url"data 金鑰則設定為網址字串。

const absoluteUrlRecord = {
  recordType: "absolute-url",
  data:"https://w3c.github.io/web-nfc/"
};

const ndef = new NDEFReader();
await ndef.write({ records: [absoluteUrlRecord] });

閱讀及撰寫智慧海報記錄

智慧型海報記錄 (用於雜誌廣告、傳單、看板等) 中,會以 NDEF 記錄的形式描述某些網路內容,其中包含 NDEF 訊息做為其酬載。呼叫 record.toRecords()data 轉換為智慧海報記錄中的記錄清單。其中應有網址記錄、標題的文字記錄、圖片的 MIME 類型記錄,以及一些自訂本機類型記錄,例如 ":t"":act"":s" 分別代表智慧海報記錄的類型、動作和大小。

本機類型記錄只有在內含 NDEF 記錄的本機類型中是唯一的。如果類型的含義不在內含記錄的本機結構定義以外,且儲存空間使用量屬於硬性限制,請使用這些類型。在網路 NFC 中,本機類型記錄名稱一律以 : 開頭 (例如 ":t"":s"":act")。這是為了區分文字記錄與本機類型文字記錄 (例如本機類型記錄)。

function readSmartPosterRecord(smartPosterRecord) {
  console.assert(record.recordType === "smart-poster");
  let action, text, url;

  for (const record of smartPosterRecord.toRecords()) {
    if (record.recordType == "text") {
      const decoder = new TextDecoder(record.encoding);
      text = decoder.decode(record.data);
    } else if (record.recordType == "url") {
      const decoder = new TextDecoder();
      url = decoder.decode(record.data);
    } else if (record.recordType == ":act") {
      action = record.data.getUint8(0);
    } else {
      // TODO: Handle other type of records such as `:t`, `:s`.
    }
  }

  switch (action) {
    case 0:
      // Do the action
      break;
    case 1:
      // Save for later
      break;
    case 2:
      // Open for editing
      break;
  }
}

如要撰寫智慧海報記錄,請將 NDEF 訊息傳遞至 NDEFReader write() 方法。NDEF 訊息中包含的智慧海報記錄會定義為一個物件,其 recordType 鍵設為 "smart-poster"data 鍵則設為物件,該物件代表 (再次) 代表智慧型海報記錄中的 NDEF 訊息。

const encoder = new TextEncoder();
const smartPosterRecord = {
  recordType: "smart-poster",
  data: {
    records: [
      {
        recordType: "url", // URL record for smart poster content
        data: "https://my.org/content/19911"
      },
      {
        recordType: "text", // title record for smart poster content
        data: "Funny dance"
      },
      {
        recordType: ":t", // type record, a local type to smart poster
        data: encoder.encode("image/gif") // MIME type of smart poster content
      },
      {
        recordType: ":s", // size record, a local type to smart poster
        data: new Uint32Array([4096]) // byte size of smart poster content
      },
      {
        recordType: ":act", // action record, a local type to smart poster
        // do the action, in this case open in the browser
        data: new Uint8Array([0])
      },
      {
        recordType: "mime", // icon record, a MIME type record
        mediaType: "image/png",
        data: await (await fetch("icon1.png")).arrayBuffer()
      },
      {
        recordType: "mime", // another icon record
        mediaType: "image/jpg",
        data: await (await fetch("icon2.jpg")).arrayBuffer()
      }
    ]
  }
};

const ndef = new NDEFReader();
await ndef.write({ records: [smartPosterRecord] });

讀取及寫入外部類型記錄

如要建立應用程式定義記錄,請使用外部類型記錄。這些訊息可能包含 NDEF 訊息做為酬載,您可以使用 toRecords() 存取。其名稱包含核發機構的網域名稱、冒號和至少包含一個字元的類型名稱,例如 "example.com:foo"

function readExternalTypeRecord(externalTypeRecord) {
  for (const record of externalTypeRecord.toRecords()) {
    if (record.recordType == "text") {
      const decoder = new TextDecoder(record.encoding);
      console.log(`Text: ${textDecoder.decode(record.data)} (${record.lang})`);
    } else if (record.recordType == "url") {
      const decoder = new TextDecoder();
      console.log(`URL: ${decoder.decode(record.data)}`);
    } else {
      // TODO: Handle other type of records.
    }
  }
}

如要寫入外部類型記錄,請將 NDEF 訊息字典傳遞至 NDEFReader write() 方法。NDEF 訊息中包含的外部類型記錄定義為物件,其 recordType 金鑰是設為外部類型名稱,而 data 金鑰則設為代表外部類型記錄中包含的 NDEF 訊息的物件。請注意,data 鍵也可以是 ArrayBuffer 或提供 ArrayBuffer 的檢視畫面 (例如 Uint8ArrayDataView)。

const externalTypeRecord = {
  recordType: "example.game:a",
  data: {
    records: [
      {
        recordType: "url",
        data: "https://example.game/42"
      },
      {
        recordType: "text",
        data: "Game context given here"
      },
      {
        recordType: "mime",
        mediaType: "image/png",
        data: await (await fetch("image.png")).arrayBuffer()
      }
    ]
  }
};

const ndef = new NDEFReader();
ndef.write({ records: [externalTypeRecord] });

讀取及寫入空白記錄

空白記錄沒有酬載。

如要寫入空白記錄,請將 NDEF 訊息字典傳遞至 NDEFReader write() 方法。NDEF 訊息包含的空白記錄會定義為具有 recordType 金鑰設為 "empty" 的物件。

const emptyRecord = {
  recordType: "empty"
};

const ndef = new NDEFReader();
await ndef.write({ records: [emptyRecord] });

瀏覽器支援

Android 版 Chrome 第 89 版支援網路 NFC。

開發人員提示

以下是我一開始使用 Web NFC 時學到的內容:

  • 在 Web NFC 運作前,Android 會在作業系統層級處理 NFC 標記。
  • 你可以在 material.io 找到 NFC 圖示。
  • 使用 NDEF 記錄 id,就能在需要時輕鬆識別記錄。
  • 支援 NDEF 的未格式化 NFC 標記含有空白類型的單一記錄。
  • 編寫 Android 應用程式記錄非常簡單,如下所示。
const encoder = new TextEncoder();
const aarRecord = {
  recordType: "android.com:pkg",
  data: encoder.encode("com.example.myapp")
};

const ndef = new NDEFReader();
await ndef.write({ records: [aarRecord] });

試聽帶

歡迎試用官方樣本,並瀏覽一些酷炫的網路 NFC 示範模式:

2019 年 Chrome 開發人員高峰會上的網路 NFC 卡示範

意見回饋:

歡迎透過 Web NFC 社群群組和 Chrome 團隊瞭解您對於網路 NFC 的想法和使用體驗。

告訴我們 API 設計

API 有沒有正常運作的問題嗎?或者您需要某些方法或屬性來實作構想嗎?

前往 Web NFC GitHub 存放區提交規格問題,或將您的想法新增至現有問題。

回報導入問題

您在執行 Chrome 時發現錯誤了嗎?還是實作與規格不同?

前往 https://new.crbug.com 回報錯誤。請務必盡可能附上詳細資料,提供重現錯誤的簡易操作說明,並將「元件」設為 Blink>NFCGlitch 適合用來分享快速簡易的提案。

展現支持

你打算使用網路 NFC 嗎?透過公開支援,Chrome 團隊可以優先處理功能,並讓其他瀏覽器廠商瞭解這些功能對這些功能的幫助。

請使用主題標記 #WebNFC 將 Tweet 訊息傳送至 @ChromiumDev,並告訴我們您的使用地點和方式。

實用連結

特別銘謝

感謝 Intel 員工協助實作 Web NFC。Google Chrome 仰賴由委員會組成的社群,協力推動 Chromium 專案進展。並非所有 Chromium 修訂者都是 Google 員工,這些貢獻者應獲得特別的表揚!