ตอนนี้คุณสามารถอ่านและเขียนไปยังแท็ก NFC ได้แล้ว
Web NFC คืออะไร
NFC ย่อมาจาก Near Field Communications ซึ่งเป็นเทคโนโลยีไร้สายระยะสั้น ที่ทำงานที่ความถี่ 13.56 MHz ซึ่งช่วยให้อุปกรณ์สื่อสารกันได้ในระยะ ไม่เกิน 10 ซม. และมีอัตราการส่งข้อมูลสูงสุด 424 kbit/s
Web NFC ช่วยให้เว็บไซต์อ่านและเขียนแท็ก NFC ได้เมื่ออยู่ใกล้กับอุปกรณ์ของผู้ใช้ (โดยปกติคือ 5-10 ซม. หรือ 2-4 นิ้ว) ขอบเขตปัจจุบันจำกัดอยู่ที่รูปแบบการแลกเปลี่ยนข้อมูล NFC (NDEF) ซึ่งเป็นรูปแบบข้อความไบนารีที่มีขนาดเล็ก ซึ่งใช้ได้กับแท็กรูปแบบต่างๆ

กรณีการใช้งานที่แนะนำ
Web NFC จำกัดไว้ที่ NDEF เนื่องจากคุณสมบัติด้านความปลอดภัยของการอ่านและ การเขียนข้อมูล NDEF สามารถวัดได้ง่ายกว่า ไม่รองรับการดำเนินการ I/O ระดับต่ำ (เช่น ISO-DEP, NFC-A/B, NFC-F), โหมดการสื่อสารแบบเพียร์ทูเพียร์ และการจำลองบัตรที่อิงตามโฮสต์ (HCE)
ตัวอย่างเว็บไซต์ที่อาจใช้ Web NFC ได้แก่
- พิพิธภัณฑ์และหอศิลป์สามารถแสดงข้อมูลเพิ่มเติมเกี่ยวกับนิทรรศการ เมื่อผู้ใช้แตะอุปกรณ์กับการ์ด NFC ใกล้กับนิทรรศการ
- เว็บไซต์การจัดการสินค้าคงคลังสามารถอ่านหรือเขียนข้อมูลลงในแท็ก NFC บนคอนเทนเนอร์เพื่ออัปเดตข้อมูลเกี่ยวกับเนื้อหาของคอนเทนเนอร์
- เว็บไซต์การประชุมสามารถใช้เพื่อสแกนป้าย NFC ระหว่างกิจกรรมและตรวจสอบว่า ป้ายถูกล็อกเพื่อป้องกันการเปลี่ยนแปลงข้อมูลที่เขียนบนป้ายเพิ่มเติม
- เว็บไซต์สามารถใช้เพื่อแชร์ข้อมูลลับเริ่มต้นที่จำเป็นสำหรับสถานการณ์การจัดสรรอุปกรณ์หรือบริการ และยังใช้เพื่อติดตั้งข้อมูลการกำหนดค่าในโหมดการทำงาน ได้ด้วย

สถานะปัจจุบัน
ขั้นตอน | สถานะ |
---|---|
1. สร้างวิดีโออธิบาย | เสร็จสมบูรณ์ |
2. สร้างร่างข้อกำหนดเบื้องต้น | เสร็จสมบูรณ์ |
3. รวบรวมความคิดเห็นและทำซ้ำการออกแบบ | เสร็จสมบูรณ์ |
4. ช่วงทดลองใช้จากต้นทาง | เสร็จสมบูรณ์ |
5. เปิดตัว | เสร็จสมบูรณ์ |
ใช้ Web NFC
การตรวจหาฟีเจอร์
การตรวจหาฟีเจอร์สำหรับฮาร์ดแวร์จะแตกต่างจากสิ่งที่คุณอาจคุ้นเคย NDEFReader
แสดงให้เห็นว่าเบราว์เซอร์รองรับ Web NFC แต่ไม่ได้บอกว่ามีฮาร์ดแวร์ที่จำเป็นหรือไม่ โดยเฉพาะอย่างยิ่ง หากไม่มีฮาร์ดแวร์ ระบบจะปฏิเสธ Promise ที่ส่งคืนโดยการเรียกบางอย่าง ฉันจะให้รายละเอียดเมื่ออธิบาย NDEFReader
if ('NDEFReader' in window) { /* Scan and write NFC tags */ }
คำศัพท์
แท็ก NFC เป็นอุปกรณ์ NFC แบบพาสซีฟ ซึ่งหมายความว่าแท็กจะทำงานด้วยการเหนี่ยวนำแม่เหล็กเมื่ออุปกรณ์ NFC ที่ใช้งานอยู่ (เช่น โทรศัพท์) อยู่ใกล้ๆ แท็ก NFC มีหลายรูปแบบ เช่น สติกเกอร์ บัตรเครดิต สายรัดข้อมือ และ อื่นๆ

ออบเจ็กต์ NDEFReader
คือจุดแรกเข้าใน Web NFC ที่เปิดเผยฟังก์ชันการทำงาน สำหรับการเตรียมการอ่านและ/หรือเขียนการดำเนินการที่จะดำเนินการเมื่อแท็ก NDEF อยู่ใกล้ๆ NDEF
ใน NDEFReader
ย่อมาจาก NFC Data Exchange Format ซึ่งเป็นรูปแบบข้อความไบนารีที่มีขนาดเล็กซึ่งได้รับการรับรองมาตรฐานจาก NFC Forum
ออบเจ็กต์ NDEFReader
ใช้สำหรับการดำเนินการกับข้อความ NDEF ขาเข้าจากแท็ก NFC และสำหรับการเขียนข้อความ NDEF ลงในแท็ก NFC ภายในช่วง
แท็ก NFC ที่รองรับ NDEF ก็เหมือนกับโพสต์อิท ทุกคนสามารถอ่านได้ และทุกคนสามารถเขียนได้ เว้นแต่จะเป็นแบบอ่านอย่างเดียว โดยมีข้อความ NDEF เดียวซึ่งห่อหุ้มระเบียน NDEF อย่างน้อย 1 รายการ แต่ละระเบียน NDEF เป็น โครงสร้างไบนารีที่มีเพย์โหลดข้อมูลและข้อมูลประเภทที่เชื่อมโยง Web NFC รองรับประเภทระเบียนที่ได้มาตรฐานของ NFC Forum ดังนี้ ว่างเปล่า ข้อความ URL โปสเตอร์อัจฉริยะ ประเภท MIME, URL แบบสัมบูรณ์, ประเภทภายนอก, ไม่รู้จัก และประเภทภายใน

สแกนแท็ก NFC
หากต้องการสแกนแท็ก NFC ให้สร้างออบเจ็กต์ NDEFReader
ใหม่ก่อน การเรียก scan()
จะแสดงผล Promise ระบบอาจแจ้งให้ผู้ใช้ทราบหากก่อนหน้านี้ไม่ได้ให้สิทธิ์เข้าถึง สัญญาจะได้รับการแก้ไขหากเป็นไปตามเงื่อนไขต่อไปนี้ทั้งหมด
- โดยจะเรียกใช้เมื่อมีการตอบสนองต่อท่าทางของผู้ใช้เท่านั้น เช่น ท่าทางสัมผัสหรือ การคลิกเมาส์
- ผู้ใช้ได้อนุญาตให้เว็บไซต์โต้ตอบกับอุปกรณ์ NFC
- โทรศัพท์ของผู้ใช้รองรับ NFC
- ผู้ใช้ได้เปิดใช้ NFC ในโทรศัพท์แล้ว
เมื่อ Promise ได้รับการแก้ไขแล้ว ข้อความ NDEF ขาเข้าจะพร้อมใช้งานโดย การสมัครใช้บริการเหตุการณ์ reading
ผ่าน Listener เหตุการณ์ นอกจากนี้ คุณควรติดตาม กิจกรรมของ 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
event โดยมีพร็อพเพอร์ตี้ 2 รายการที่เฉพาะเจาะจงสำหรับบัญชีนี้ ดังนี้
serialNumber
แสดงหมายเลขซีเรียลของอุปกรณ์ (เช่น 00-11-22-33-44-55-66) หรือสตริงว่างหากไม่มีmessage
แสดงข้อความ NDEF ที่จัดเก็บไว้ในแท็ก NFC
หากต้องการอ่านเนื้อหาของข้อความ NDEF ให้วนซ้ำผ่าน message.records
และ ประมวลผลสมาชิก data
อย่างเหมาะสมตาม recordType
ระบบจะแสดง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()
จะแสดงผล Promise ระบบอาจแจ้งให้ผู้ใช้ดำเนินการหากก่อนหน้านี้ไม่ได้ให้สิทธิ์เข้าถึง ในขั้นตอนนี้ ระบบจะ "เตรียม" ข้อความ NDEF และสัญญา จะได้รับการแก้ไขหากเป็นไปตามเงื่อนไขต่อไปนี้ทั้งหมด
- โดยจะเรียกใช้เมื่อมีการตอบสนองต่อท่าทางของผู้ใช้เท่านั้น เช่น ท่าทางสัมผัสหรือ การคลิกเมาส์
- ผู้ใช้ได้อนุญาตให้เว็บไซต์โต้ตอบกับอุปกรณ์ 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}.`); });
หากต้องการเขียนระเบียน URL ลงในแท็ก NFC ให้ส่งพจนานุกรมที่แสดงข้อความ NDEF ไปยัง write()
ในตัวอย่างด้านล่าง ข้อความ NDEF คือพจนานุกรม ที่มีคีย์ records
ค่าของคีย์นี้คืออาร์เรย์ของระเบียน ในกรณีนี้คือระเบียน URL ที่กำหนดเป็นออบเจ็กต์ที่มีคีย์ recordType
ตั้งค่าเป็น "url"
และคีย์ data
ตั้งค่าเป็นสตริง URL
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 ที่ไม่ได้มีไว้เพื่อเขียนทับ ให้ตั้งค่าพร็อพเพอร์ตี้ overwrite
เป็น false
ในตัวเลือกที่ส่งไปยังเมธอด write()
ในกรณีนี้ สัญญาที่ส่งคืนจะปฏิเสธหากมีการจัดเก็บข้อความ 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()
จะแสดงผล Promise ระบบอาจแจ้งให้ผู้ใช้ดำเนินการหากก่อนหน้านี้ไม่ได้ให้สิทธิ์เข้าถึง Promise จะได้รับการแก้ไขหากเป็นไปตามเงื่อนไขต่อไปนี้ทั้งหมด
- โดยจะเรียกใช้เมื่อมีการตอบสนองต่อท่าทางของผู้ใช้เท่านั้น เช่น ท่าทางสัมผัสหรือ การคลิกเมาส์
- ผู้ใช้ได้อนุญาตให้เว็บไซต์โต้ตอบกับอุปกรณ์ 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()
พร้อมใช้งานใน Android ใน Chrome 100 ขึ้นไป ให้ตรวจสอบว่าฟีเจอร์นี้รองรับสิ่งต่อไปนี้หรือไม่
if ("NDEFReader" in window && "makeReadOnly" in NDEFReader.prototype) { // makeReadOnly() is supported. }
ความปลอดภัยและสิทธิ์
ทีม Chrome ได้ออกแบบและใช้ Web NFC ตามหลักการพื้นฐาน ที่ระบุไว้ในการควบคุมการเข้าถึงฟีเจอร์ที่มีประสิทธิภาพของแพลตฟอร์มเว็บ ซึ่งรวมถึงการควบคุมของผู้ใช้ ความโปร่งใส และการยศาสตร์
เนื่องจาก NFC ขยายโดเมนของข้อมูลที่อาจพร้อมใช้งานสำหรับเว็บไซต์ที่เป็นอันตราย เราจึงจำกัดความพร้อมใช้งานของ NFC เพื่อเพิ่มการรับรู้ของผู้ใช้และควบคุมการใช้ NFC ให้ได้มากที่สุด

Web 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
การใช้ Primitive AbortController
จะช่วยให้ยกเลิกการดำเนินการ NFC ได้ง่าย ตัวอย่างด้านล่างแสดงวิธีส่ง signal
ของ AbortController
ผ่านตัวเลือกของ NDEFReader scan()
, makeReadOnly()
, write()
และยกเลิกการดำเนินการ NFC ทั้ง 2 รายการพร้อมกัน
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
Primitive จะช่วยให้อ่านแท็ก NFC ได้หลังจากเขียนข้อความลงในแท็ก ตัวอย่างด้านล่างแสดงวิธีเขียนข้อความไปยังแท็ก NFC และอ่าน ข้อความใหม่ในแท็ก NFC โดยจะหยุดสแกนหลังจากผ่านไป 3 วินาที
// 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.
อ่านและเขียนบันทึกข้อความ
ข้อความในระเบียน data
จะถอดรหัสได้ด้วย TextDecoder
ที่สร้างขึ้นด้วยพร็อพเพอร์ตี้ระเบียน encoding
โปรดทราบว่าภาษาของระเบียนข้อความ พร้อมใช้งานผ่านพร็อพเพอร์ตี้ 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 และจะใช้ภาษาของเอกสารปัจจุบัน แต่คุณระบุทั้ง 2 พร็อพเพอร์ตี้ (encoding
และ lang
) ได้โดยใช้ไวยากรณ์แบบเต็ม สำหรับการสร้างระเบียน NDEF ที่กำหนดเอง
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] });
อ่านและเขียนระเบียน URL
ใช้ TextDecoder
เพื่อถอดรหัส data
ของการบันทึก
function readUrlRecord(record) { console.assert(record.recordType === "url"); const textDecoder = new TextDecoder(); console.log(`URL: ${textDecoder.decode(record.data)}`); }
หากต้องการเขียนระเบียน URL ให้ส่งพจนานุกรมข้อความ NDEF ไปยังเมธอด NDEFReader write()
ระบบจะกำหนดระเบียน URL ที่อยู่ในข้อความ NDEF เป็นออบเจ็กต์ที่มีคีย์ recordType
ตั้งค่าเป็น "url"
และคีย์ data
ตั้งค่าเป็นสตริง URL
const urlRecord = { recordType: "url", data:"https://w3c.github.io/web-nfc/" }; const ndef = new NDEFReader(); await ndef.write({ records: [urlRecord] });
อ่านและเขียนระเบียนประเภท MIME
พร็อพเพอร์ตี้ mediaType
ของระเบียนประเภท MIME แสดงถึงประเภท MIME ของเพย์โหลดระเบียน NDEF เพื่อให้ data
ถอดรหัสได้อย่างถูกต้อง เช่น ใช้ JSON.parse
เพื่อถอดรหัสข้อความ JSON และใช้องค์ประกอบรูปภาพเพื่อถอดรหัสข้อมูลรูปภาพ
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()
ระเบียนประเภท MIME ที่อยู่ในข้อความ NDEF จะกำหนด เป็นออบเจ็กต์ที่มีคีย์ recordType
ตั้งค่าเป็น "mime"
, คีย์ mediaType
ตั้งค่าเป็น ประเภท MIME จริงของเนื้อหา และคีย์ data
ตั้งค่าเป็นออบเจ็กต์ที่อาจเป็น ArrayBuffer
หรือให้มุมมองไปยัง ArrayBuffer
(เช่น Uint8Array
, DataView
)
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] });
อ่านและเขียนระเบียน URL ที่สมบูรณ์
คุณถอดรหัสระเบียน URL แบบสัมบูรณ์ data
ได้ด้วย TextDecoder
แบบง่ายๆ
function readAbsoluteUrlRecord(record) { console.assert(record.recordType === "absolute-url"); const textDecoder = new TextDecoder(); console.log(`Absolute URL: ${textDecoder.decode(record.data)}`); }
หากต้องการเขียนระเบียน URL แบบสัมบูรณ์ ให้ส่งพจนานุกรมข้อความ NDEF ไปยังเมธอด NDEFReader write()
ระบบจะกำหนดระเบียน URL แบบสัมบูรณ์ที่อยู่ในข้อความ NDEF เป็นออบเจ็กต์ที่มีคีย์ recordType
ตั้งค่าเป็น "absolute-url"
และคีย์ data
ตั้งค่าเป็นสตริง URL
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
เป็นรายการ ของระเบียนที่มีอยู่ในระเบียนโปสเตอร์อัจฉริยะ โดยควรมีระเบียน URL, ระเบียนข้อความสำหรับชื่อ, ระเบียนประเภท MIME สำหรับรูปภาพ และระเบียนประเภท ที่กำหนดเอง เช่น ":t"
, ":act"
และ ":s"
ตามลำดับสำหรับ ประเภท การดำเนินการ และขนาดของระเบียนโปสเตอร์อัจฉริยะ
ระเบียนประเภทเฉพาะที่ใช้ในเครื่องจะใช้ได้เฉพาะในบริบทของเครื่องที่มีระเบียน NDEF เท่านั้น ใช้เมื่อความหมายของประเภทไม่สำคัญนอกบริบทเฉพาะของระเบียนที่มีอยู่ และเมื่อการใช้พื้นที่เก็บข้อมูลเป็นข้อจำกัดที่เข้มงวด ชื่อระเบียนประเภทเฉพาะที่จะขึ้นต้นด้วย :
เสมอใน Web 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 ไปยังเมธอด write()
ของ NDEFReader ระบบจะกำหนดระเบียนโปสเตอร์อัจฉริยะที่อยู่ในข้อความ 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()
ชื่อของไฟล์เหล่านี้มีชื่อโดเมนขององค์กรที่ออกใบรับรอง เครื่องหมายโคลอน และชื่อประเภทที่มีความยาวอย่างน้อย 1 อักขระ เช่น "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
ก็ได้ (เช่น Uint8Array
, DataView
)
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] });
การสนับสนุนเบราว์เซอร์
Web NFC พร้อมใช้งานบน Android ใน Chrome 89
เคล็ดลับสำหรับนักพัฒนาแอป
ต่อไปนี้คือรายการสิ่งที่ฉันอยากรู้เมื่อเริ่มเล่น Web NFC
- Android จัดการแท็ก NFC ที่ระดับระบบปฏิบัติการก่อนที่ Web NFC จะทำงานได้
- คุณดูไอคอน NFC ได้ที่ material.io
- ใช้ระเบียน NDEF
id
เพื่อระบุระเบียนได้อย่างง่ายดายเมื่อจำเป็น - แท็ก NFC ที่ไม่ได้จัดรูปแบบซึ่งรองรับ NDEF จะมีระเบียนเดียวของประเภทว่าง
- การเขียนบันทึกแอปพลิเคชัน 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] });
การสาธิต
ลองใช้ตัวอย่างอย่างเป็นทางการและดูการสาธิต Web NFC ที่น่าสนใจ
ความคิดเห็น
กลุ่มชุมชน Web NFC และทีม Chrome อยากทราบความคิดเห็นและประสบการณ์ของคุณเกี่ยวกับ Web NFC
บอกเราเกี่ยวกับการออกแบบ API
มีอะไรเกี่ยวกับ API ที่ไม่ทำงานตามที่คาดไว้ไหม หรือมีเมธอดหรือพร็อพเพอร์ตี้ที่ขาดหายไปซึ่งคุณต้องใช้เพื่อนำไอเดียไปใช้ไหม
แจ้งปัญหาเกี่ยวกับข้อกำหนดในที่เก็บ Web NFC ใน GitHub หรือแสดงความคิดเห็นในปัญหาที่มีอยู่
รายงานปัญหาเกี่ยวกับการติดตั้งใช้งาน
หากพบข้อบกพร่องในการใช้งาน Chrome หรือการติดตั้งใช้งาน แตกต่างจากข้อกำหนด
ยื่นข้อบกพร่องที่ https://new.crbug.com อย่าลืมระบุรายละเอียดให้มากที่สุด เท่าที่จะทำได้ ระบุวิธีการง่ายๆ ในการทำซ้ำข้อบกพร่อง และตั้งค่าคอมโพเนนต์เป็น Blink>NFC
แสดงการสนับสนุน
คุณวางแผนที่จะใช้ Web NFC ไหม การสนับสนุนแบบสาธารณะของคุณจะช่วยให้ทีม Chrome จัดลําดับความสําคัญของฟีเจอร์และแสดงให้ผู้ให้บริการเบราว์เซอร์รายอื่นๆ เห็นว่าการ สนับสนุนฟีเจอร์เหล่านี้มีความสําคัญเพียงใด
ทวีตถึง @ChromiumDev โดยใช้แฮชแท็ก #WebNFC
และแจ้งให้เราทราบว่าคุณใช้ฟีเจอร์นี้ที่ไหนและอย่างไร
ลิงก์ที่มีประโยชน์
- ข้อกำหนด
- การสาธิต Web NFC
- ข้อบกพร่องในการติดตาม
- รายการใน ChromeStatus.com
- คอมโพเนนต์ Blink:
Blink>NFC
การรับทราบ
ขอขอบคุณทีมงานที่ Intel ที่ติดตั้งใช้งาน Web NFC Google Chrome ขึ้นอยู่กับชุมชนผู้มีสิทธิ์ที่ทำงานร่วมกันเพื่อขับเคลื่อนโปรเจ็กต์ Chromium ผู้ร่วมแก้ไข Chromium บางคนไม่ได้เป็นพนักงานของ Google และ ผู้มีส่วนร่วมเหล่านี้สมควรได้รับการยกย่องเป็นพิเศษ