Możliwe jest teraz odczytywanie i zapisywanie danych w tagach NFC.
Co to jest Web NFC?
NFC oznacza technologię łączności bezprzewodowej Near Field Communications. działające 13,56 MHz, co umożliwia komunikację między urządzeniami w odległości mniej niż 10 cm i szybkość transmisji do 424 kb/s.
Internet NFC umożliwia witrynom odczyt i zapis w tagach NFC, gdy są one w pobliżu urządzenia użytkownika (zwykle 5-10 cm). Bieżący zakres jest ograniczony do formatu NDEF (NFC) binarny, który działa z różnymi formatami tagów.
Sugerowane zastosowania
Komunikacja internetowa NFC jest ograniczona do NDEF, ponieważ właściwości zabezpieczeń odczytu danych NDEF można łatwiej zmierzyć. Operacje wejścia-wyjścia niskiego poziomu (np. ISO-DEP, NFC-A/B, NFC-F), tryb komunikacji peer-to-peer i kartę hosta Emulacja (HCE) nie jest obsługiwana.
Przykłady stron, które mogą korzystać z technologii NFC:
- Muzea i galerie sztuki mogą wyświetlać dodatkowe informacje na temat wystawy gdy użytkownik dotyka swojego urządzenia karty NFC w pobliżu wystawy.
- Witryny zarządzania asortymentem mogą odczytywać i zapisywać dane w tagu NFC w celu aktualizacji informacji o jego zawartości.
- Witryny konferencyjne mogą za jego pomocą skanować znaczki NFC podczas wydarzenia i sprawdzać, są zablokowane, aby zapobiec dalszej zmianie zapisanych na nich informacji.
- Witryny mogą jej używać do udostępniania wstępnych obiektów tajnych wymaganych na potrzeby urządzenia lub usługi scenariuszach obsługi administracyjnej oraz wdrażanie danych konfiguracyjnych i trybu uzyskiwania zgody.
Obecny stan,
Krok | Stan |
---|---|
1. Utwórz wyjaśnienie | Zakończono |
2. Utwórz początkową wersję roboczą specyfikacji | Zakończono |
3. Zbieraj opinie iterować projekt | Zakończono |
4. Wersja próbna origin | Zakończono |
5. Wprowadzenie na rynek | Zakończono |
Użyj internetowego NFC
Wykrywanie cech
Wykrywanie funkcji na sprzęcie działa inaczej niż zwykle.
Obecność rozszerzenia NDEFReader
informuje, że przeglądarka obsługuje komunikację internetową NFC,
nie ma informacji o tym, czy jest dostępny
wymagany sprzęt. Zwłaszcza, jeśli sprzęt
obietnice podane w odpowiedzi na niektóre połączenia zostaną odrzucone. Przekażę
szczegóły, gdy opisuję NDEFReader
.
if ('NDEFReader' in window) { /* Scan and write NFC tags */ }
Terminologia
Tag NFC jest pasywnym urządzeniem NFC, co oznacza, że jest ono zasilane magnesem. gdy w pobliżu znajduje się aktywne urządzenie z modułem NFC (takie jak telefon). Tagi NFC są dostępne w różnych formach i modzie, np. naklejki, karty kredytowe, na nadgarstki, i innych.
Obiekt NDEFReader
to punkt wejścia w Web NFC, który udostępnia funkcje
do przygotowywania działań związanych z czytaniem lub pisaniem, które są wykonywane przez tag NDEF
w pobliżu. NDEF
w NDEFReader
oznacza NFC Data Exchange
To nieduży format wiadomości binarnych ustandaryzowany przez NFC Forum.
Obiekt NDEFReader
służy do obsługi przychodzących wiadomości NDEF z tagów NFC
oraz do zapisywania wiadomości NDEF do tagów NFC w zasięgu.
Tag NFC obsługujący NDEF działa jak kartka pocztowa. Każdy może je przeczytać oraz chyba że jest on dostępny tylko do odczytu, każdy może w nim zapisywać. Zawiera pojedynczy NDEF komunikat zawierający co najmniej jeden rekord NDEF. Każdy rekord NDEF to strukturę binarną zawierającą ładunek danych i powiązane z nim informacje o typie. Komunikacja internetowa NFC obsługuje następujące ustandaryzowane typy rekordów NFC Forum: puste, tekstowe, URL, plakat inteligentny, typ MIME, bezwzględny URL, typ zewnętrzny, nieznany i lokalny typu.
Skanuj tagi NFC
Aby skanować tagi NFC, najpierw utwórz nowy obiekt NDEFReader
. Dzwonię pod scan()
zwraca obietnicę. Jeśli użytkownik nie miał wcześniej dostępu, może zobaczyć prośbę o dostęp
przyznane. Obietnica zostanie zrealizowana, jeśli zostaną spełnione te warunki:
- Została wywołana tylko w odpowiedzi na gest użytkownika, taki jak gest dotykowy lub kliknięciem myszy.
- Użytkownik zezwolił stronie na interakcję z urządzeniami z NFC.
- Telefon użytkownika obsługuje komunikację NFC.
- użytkownik włączył komunikację NFC na telefonie,
Po spełnieniu obietnicy przychodzące wiadomości NDEF będą dostępne przez
subskrybowanie zdarzeń reading
za pomocą detektora zdarzeń. Warto też zasubskrybować
do readingerror
zdarzeń, które mają być powiadamiane o niezgodnych tagach NFC
w pobliżu.
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}.`);
});
Gdy w pobliżu znajduje się tag NFC, wywoływane jest zdarzenie NDEFReadingEvent
. it
ma dwie unikalne właściwości:
serialNumber
oznacza numer seryjny urządzenia (np. 00-11-22-33-44-55-66) lub pusty ciąg, jeśli żaden nie jest dostępny.message
oznacza wiadomość NDEF przechowywaną w tagu NFC.
Aby odczytać treść wiadomości NDEF, wykonaj pętlę: message.records
i
odpowiednio przetwarza użytkowników data
na podstawie tych danych: recordType
.
Użytkownik data
jest widoczny jako DataView
, ponieważ umożliwia obsługę
gdy dane są zakodowane w 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.
}
}
};
Zapisywanie tagów NFC
Aby zapisać tagi NFC, najpierw utwórz nowy obiekt NDEFReader
. Łączę
write()
zwraca obietnicę. Jeśli dostęp nie był możliwy, użytkownik może zobaczyć prośbę
wcześniej przyznane. W tym momencie komunikat NDEF jest „gotowy” i obietnica
zostanie rozwiązany, jeśli zostaną spełnione wszystkie te warunki:
- Została wywołana tylko w odpowiedzi na gest użytkownika, taki jak gest dotykowy lub kliknięciem myszy.
- Użytkownik zezwolił stronie na interakcję z urządzeniami z NFC.
- Telefon użytkownika obsługuje komunikację NFC.
- użytkownik włączył komunikację NFC na telefonie,
- Użytkownik zbliżył tag NFC i wiadomość NDEF została napisana.
Aby zapisać tekst w tagu NFC, przekaż ciąg znaków do metody write()
.
const ndef = new NDEFReader();
ndef.write(
"Hello World"
).then(() => {
console.log("Message written.");
}).catch(error => {
console.log(`Write failed :-( try again: ${error}.`);
});
Aby zapisać rekord URL w tagu NFC, przekaż słownik reprezentujący NDEF
wiadomość do: write()
. W przykładzie poniżej wiadomość NDEF jest słownikiem
z kluczem records
. Jego wartością jest tablica rekordów – w tym przypadku jest to adres URL
rekord zdefiniowany jako obiekt z kluczem recordType
ustawionym na "url"
i data
jest ustawiony na ciąg adresu 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}.`);
});
W tagu NFC można też zapisać wiele rekordów.
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}.`);
});
Jeśli tag NFC zawiera wiadomość NDEF, której nie należy zastępować, ustaw
właściwość overwrite
do false
w opcjach przekazywanych do funkcji write()
. W takim przypadku zwrócona obietnica zostanie odrzucona, jeśli wiadomość NDEF zostanie
już zapisane w tagu 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}.`);
});
Ustaw tagi NFC jako tylko do odczytu
Aby zapobiec zastępowaniu treści tagów NFC przez złośliwe oprogramowanie, możesz: ustaw tagi NFC na stałe tylko do odczytu. Jest to proces jednokierunkowy, nie można cofnąć. Gdy tag NFC zostanie ustawiony jako tylko do odczytu, nie będzie można go zapisać już tak.
Aby tagi NFC były dostępne tylko do odczytu, najpierw utwórz nowy obiekt NDEFReader
. Łączę
makeReadOnly()
zwraca obietnicę. Jeśli dostęp nie był możliwy, użytkownik może zobaczyć prośbę
wcześniej przyznane. Obietnica zostanie zrealizowana, jeśli zostaną spełnione wszystkie poniższe warunki
spotkało:
- Została wywołana tylko w odpowiedzi na gest użytkownika, taki jak gest dotykowy lub kliknięciem myszy.
- Użytkownik zezwolił stronie na interakcję z urządzeniami z NFC.
- Telefon użytkownika obsługuje komunikację NFC.
- użytkownik włączył komunikację NFC na telefonie,
- Użytkownik kliknął tag NFC i został on ustawiony jako tylko do odczytu.
const ndef = new NDEFReader();
ndef.makeReadOnly()
.then(() => {
console.log("NFC tag has been made permanently read-only.");
}).catch(error => {
console.log(`Operation failed: ${error}`);
});
Oto jak ustawić tag NFC na stałe tylko do odczytu po zapisaniu w nim danych.
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}`);
}
Aplikacja makeReadOnly()
jest dostępna na Androidzie w Chrome 100 lub nowszej wersji, więc sprawdź
jeśli ta funkcja jest obsługiwana przez:
if ("NDEFReader" in window && "makeReadOnly" in NDEFReader.prototype) {
// makeReadOnly() is supported.
}
Bezpieczeństwo i uprawnienia
Zespół Chrome zaprojektował i wdrożył komunikację NFC zgodnie z podstawowymi zasadami zdefiniowane w artykule Kontrolowanie dostępu do zaawansowanej platformy internetowej funkcje, w tym kontrola użytkownika, przejrzystość i ergonomia.
Ponieważ NFC poszerza domenę informacji potencjalnie dostępnych dla szkodliwych witryn, dostępność technologii NFC jest ograniczona, aby zmaksymalizować świadomości marki i kontrolę nad wykorzystaniem NFC.
Komunikacja internetowa NFC jest dostępna tylko w przypadku ramek najwyższego poziomu i kontekstów bezpiecznego przeglądania (HTTPS)
). Źródła muszą najpierw zażądać uprawnień "nfc"
podczas obsługi pliku
gest użytkownika (np.kliknięcie przycisku). NDEFReader
scan()
, write()
i
makeReadOnly()
metod aktywuje prompt użytkownika, jeśli dostęp nie był wcześniej możliwy
przyznane.
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.
};
};
Połączenie komunikatu o zgodzie zainicjowanej przez użytkownika i rzeczywistych, fizycznych ruch polegający na zbliżeniu urządzenia do docelowego tagu NFC zbliży urządzenie do wybranego w innych interfejsach API dostępu do plików i urządzeniach.
Aby możliwe było skanowanie lub zapis, strona internetowa musi być widoczna, gdy użytkownik dotknie jej ekranu tagu NFC na urządzeniu. Przeglądarka używa reakcji haptycznych, aby wskazać, kliknij. Dostęp do modułu NFC jest zablokowany, jeśli wyświetlacz jest wyłączony lub urządzenie jest zablokowany. W przypadku niewidocznych stron internetowych odbieranie i przekazywanie treści przy użyciu NFC jest zawieszone i wznowione, gdy strona internetowa stanie się ponownie widoczna.
Dzięki interfejsowi Page Visibility API można śledzić, kiedy dokument zmiany widoczności.
document.onvisibilitychange = event => {
if (document.hidden) {
// All NFC operations are automatically suspended when document is hidden.
} else {
// All NFC operations are resumed, if needed.
}
};
Książka kucharska
Oto kilka przykładów kodu na dobry początek.
Sprawdź uprawnienia
Interfejs Permissions API umożliwia sprawdzenie, czy uprawnienie "nfc"
zostało
przyznane. Z tego przykładu dowiesz się, jak skanować tagi NFC bez interakcji użytkownika, jeśli
użytkownik otrzymał poprzedni dostęp lub wyświetl przycisk w inny sposób. Pamiętaj, że to samo
działa do zapisywania tagów NFC, ponieważ korzysta z tych samych uprawnień
Google Cloud.
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();
};
}
Przerywanie operacji NFC
Użycie elementu podstawowego AbortController
ułatwia przerwanie NFC
operacji. Przykład poniżej pokazuje, jak przekazać signal
AbortController
przy użyciu czytnika NDEFReader scan()
, makeReadOnly()
,
write()
i przerywaj obie operacje NFC w tym samym czasie.
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();
};
Czytanie po zapisie
Wykorzystuje write()
, a potem scan()
i AbortController
umożliwia odczyt tagu NFC po zapisaniu w nim wiadomości.
Przykład poniżej pokazuje, jak napisać wiadomość tekstową do tagu NFC i przeczytać ją
nową wiadomość w tagu NFC. Skanowanie zakończy się po 3 sekundach.
// 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.
Odczytywanie i pisanie rekordu tekstowego
Rekord tekstowy data
można zdekodować za pomocą polecenia TextDecoder
utworzonego z użyciem
zarejestrować właściwość encoding
. Pamiętaj, że język rekordu tekstowego to
jest dostępna w ramach właściwości lang
.
function readTextRecord(record) {
console.assert(record.recordType === "text");
const textDecoder = new TextDecoder(record.encoding);
console.log(`Text: ${textDecoder.decode(record.data)} (${record.lang})`);
}
Aby utworzyć prosty rekord tekstowy, przekaż ciąg do metody NDEFReader write()
.
const ndef = new NDEFReader();
await ndef.write("Hello World");
Rekordy tekstowe są domyślnie w formacie UTF-8 i przyjmują język bieżącego dokumentu, ale
obie właściwości (encoding
i lang
) można określić za pomocą pełnej składni
do utworzenia niestandardowego rekordu 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] });
Odczytywanie i zapisywanie rekordu adresu URL
Użyj TextDecoder
, aby zdekodować data
rekordu.
function readUrlRecord(record) {
console.assert(record.recordType === "url");
const textDecoder = new TextDecoder();
console.log(`URL: ${textDecoder.decode(record.data)}`);
}
Aby zapisać rekord URL, przekaż słownik komunikatów NDEF do czytnika NDEFReader
Metoda write()
. Rekord adresu URL zawarty w komunikacie NDEF jest zdefiniowany jako
obiekt z kluczem recordType
ustawionym na "url"
i kluczem data
ustawionym na adres URL
ciągu znaków.
const urlRecord = {
recordType: "url",
data:"https://w3c.github.io/web-nfc/"
};
const ndef = new NDEFReader();
await ndef.write({ records: [urlRecord] });
Odczytywanie i zapisywanie rekordu typu MIME
Właściwość mediaType
rekordu typu MIME reprezentuje typ MIME
Ładunek rekordu NDEF, tak aby można było poprawnie zdekodować data
. Na przykład użyj
JSON.parse
do zdekodowania tekstu JSON oraz elementu Image do dekodowania danych obrazu.
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.
}
}
Aby zapisać rekord typu MIME, przekaż słownik wiadomości NDEF do modułu NDEFReader
Metoda write()
. Zdefiniowano rekord typu MIME zawarty w wiadomości NDEF
jako obiekt, gdzie klucz recordType
jest ustawiony na "mime"
, a klucz mediaType
ustawiony na
faktyczny typ MIME treści oraz klucz data
ustawiony na obiekt, który może
być ArrayBuffer
albo przedstawia widok elementu ArrayBuffer
(np.
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] });
Odczytywanie i zapisywanie rekordu bezwzględnego adresu URL
Rekord bezwzględnego adresu URL data
można odkodować za pomocą prostego polecenia TextDecoder
.
function readAbsoluteUrlRecord(record) {
console.assert(record.recordType === "absolute-url");
const textDecoder = new TextDecoder();
console.log(`Absolute URL: ${textDecoder.decode(record.data)}`);
}
Aby zapisać rekord bezwzględnego adresu URL, przekaż słownik komunikatów NDEF do
Metoda NDEFReader write()
. Rekord z bezwzględnym adresem URL zawarty w NDEF
komunikat jest zdefiniowany jako obiekt, a klucz recordType
ustawiony na "absolute-url"
a klucz data
ustawiony na ciąg adresu URL.
const absoluteUrlRecord = {
recordType: "absolute-url",
data:"https://w3c.github.io/web-nfc/"
};
const ndef = new NDEFReader();
await ndef.write({ records: [absoluteUrlRecord] });
Czytanie i pisanie inteligentnego plakatu
Płyta z inteligentnym plakatem (wykorzystywana w reklamach w czasopismach, ulotkach, na billboardach,
itp.), opisuje niektóre treści internetowe jako rekord NDEF zawierający NDEF.
jako ładunku. Wywołaj funkcję record.toRecords()
, aby przekształcić typ data
w listę
rekordów zapisanych w plakatach inteligentnych. Powinien zawierać rekord URL,
rekord tekstowy tytułu, rekord typu MIME dla obrazu oraz niektóre niestandardowe
rekordy typu lokalnego, takie jak ":t"
, ":act"
i ":s"
,
typu, działania i rozmiaru rekordu inteligentnego plakatu.
Rekordy typu lokalnego są unikalne tylko w kontekście lokalnym tagu
rekord NDEF. Należy ich używać, gdy ich znaczenie nie ma znaczenia na zewnątrz.
lokalnego kontekstu rekordu i sytuacji, gdy wykorzystanie miejsca na dane jest
. W przypadku Web NFC nazwy rekordów typu zawsze zaczynają się od :
(np.
":t"
, ":s"
, ":act"
). Ma to na celu odróżnienie rekordu tekstowego od lokalnego
wpisz na przykład rekord tekstowy.
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;
}
}
Aby utworzyć inteligentny rekord plakatu, przekaż wiadomość NDEF do czytnika NDEFReader write()
. Rekord plakatu inteligentnego zawartego w wiadomości NDEF jest zdefiniowany jako
obiekt z kluczem recordType
ustawionym na "smart-poster"
i kluczem data
ustawionym na
obiekt, który reprezentuje (ponownie) komunikat NDEF zawarty w
inteligentny rekord plakatu.
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] });
Odczytywanie i zapisywanie rekordu typu zewnętrznego
Aby utworzyć rekordy zdefiniowane przez aplikację, użyj rekordów typu zewnętrznego. Mogą one
zawierają komunikat NDEF jako ładunek dostępny za pomocą toRecords()
. Ich
nazwa zawiera nazwę domeny organizacji wydającej dokument, dwukropek i typ
nazwa składająca się z co najmniej jednego znaku, np. "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.
}
}
}
Aby zapisać rekord typu zewnętrznego, przekaż słownik komunikatów NDEF do
Metoda NDEFReader write()
. Rekord typu zewnętrznego zawarty w NDEF
jest zdefiniowany jako obiekt z kluczem recordType
ustawionym na nazwę klucza
typ zewnętrzny, a klucz data
ustawiony na obiekt reprezentujący wiadomość NDEF
zawarte w rekordzie typu zewnętrznego. Pamiętaj, że klawisz data
może być również
– ArrayBuffer
albo pozwala wyświetlić widok elementu ArrayBuffer
(np.
Uint8Array
i 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] });
Odczytywanie i zapisywanie pustego rekordu
Pusty rekord nie ma ładunku.
Aby zapisać pusty rekord, przekaż słownik komunikatów NDEF do czytnika NDEFReader
Metoda write()
. Pusty rekord zawarty w komunikacie NDEF jest zdefiniowany jako
obiekt z kluczem recordType
ustawionym na "empty"
.
const emptyRecord = {
recordType: "empty"
};
const ndef = new NDEFReader();
await ndef.write({ records: [emptyRecord] });
Obsługa przeglądarek
Komunikacja internetowa NFC jest dostępna na Androidzie w Chrome 89.
Wskazówki dla programistów
Oto lista rzeczy, które warto wiedzieć, kiedy zacząłem korzystać z internetowej komunikacji NFC:
- Zanim zaczniesz korzystać z internetowej komunikacji NFC, Android obsługuje tagi NFC na poziomie systemu operacyjnego.
- Ikonę NFC znajdziesz na stronie material.io.
- Aby w razie potrzeby łatwo zidentyfikować rekord, użyj rekordu NDEF
id
. - Niesformatowany tag NFC, który obsługuje NDEF, zawiera pojedynczy rekord pustego typu.
- Zapisywanie rekordu aplikacji na Androida jest łatwe, jak pokazano poniżej.
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] });
Prezentacje
Wypróbuj oficjalną próbkę i zobacz fajne wersje demonstracyjne funkcji Web NFC:
- Wersja demonstracyjna kart
- Wersja demonstracyjna zakupów spożywczych
- Czujnik RSP NFC
- MEMO multimediów
Prześlij opinię
Społeczność społeczności Web NFC oraz Zespół Chrome chętnie pozna Twoje przemyślenia i doświadczenia dotyczące Web NFC.
Opowiedz nam o konstrukcji interfejsu API
Czy jest coś, co w interfejsie API nie działa zgodnie z oczekiwaniami? Czy są jeśli brakuje metod lub właściwości niezbędnych do realizacji pomysłu?
Zgłoś problem ze specyfikacją w repozytorium Web NFC na GitHubie lub dodaj opinię do do istniejącego problemu.
Zgłoś problem z implementacją
Czy wystąpił błąd z implementacją Chrome? Czy wdrożenie różni się od specyfikacji?
Zgłoś błąd na https://new.crbug.com. Podaj jak najwięcej
jak najwięcej szczegółów, podać proste instrukcje dotyczące odtworzenia błędu oraz
Ustawiono Komponenty na Blink>NFC
. Glitch działa świetnie:
szybkie i łatwe udostępnianie.
Pokaż wsparcie
Czy planujesz korzystać z Web NFC? Twoje publiczne wsparcie pomaga zespołowi Chrome nadaje priorytet funkcjom i pokazuje innym dostawcom przeglądarek, jak ważne jest ich wsparcie.
Wyślij tweeta na adres @ChromiumDev, używając hashtagu
#WebNFC
.
i daj nam znać, gdzie i jak go używasz.
Przydatne linki
- Specyfikacja
- Prezentacja NFC w przeglądarce | Źródło wersji demonstracyjnej komunikacji internetowej
- Śledzenie błędu
- Wpis na temat ChromeStatus.com
- Komponent Blink:
Blink>NFC
Podziękowania
Wielkie dzięki dla pracowników firmy Intel za wdrożenie technologii NFC. Google Chrome, zależy od społeczności kombatantów, którzy wspólnie pracują nad przeniesieniem Chromium w dalszym ciągu projektu. Nie każdy użytkownik Chromium jest Googlerem. użytkownicy zasługują na specjalne wyróżnienie!