Signatur
Beschreibung
Die Methode toRecords() gehört zur Web-NFC-API und wertet die Rohdaten (NDEFRecord.data, ein DataView) eines Datensatzes als eingebettete NDEF-Nachricht aus. Das Ergebnis ist ein Array von NDEFRecord-Objekten, die wieder genauso ausgelesen werden können wie die Datensätze der obersten Ebene.
Eingebettete Datensätze gibt es nur bei bestimmten Datensatztypen:
"smart-poster"– ein Smart Poster enthält z. B. einen URL-Datensatz, Titel-Texte, ein Icon, eine Aktion (":act") oder eine Größe (":s").- Externe Typen wie
"example.com:meinTyp"– eigene, domänengebundene Formate, die verschachtelte Datensätze tragen können. - Lokale Typen wie
":act"– nur innerhalb eines übergeordneten Datensatzes gültig.
Typischerweise ruft man toRecords() im reading-Event eines NDEFReader auf, nachdem man anhand von record.recordType geprüft hat, dass verschachtelte Daten zu erwarten sind. Für einfache Typen wie "text", "url" oder "mime" liest man stattdessen record.data direkt, etwa mit einem TextDecoder.
Rückgabewert
data eingebetteten Datensätze. Ist der recordType kein Smart Poster, kein externer und kein lokaler Typ, wird eine NotSupportedError-DOMException ausgelöst. Sind die Daten keine gültige NDEF-Nachricht, wird ebenfalls ein Fehler ausgelöst.Beispiele
Smart Poster auslesen
const reader = new NDEFReader();
const leseSmartPoster = async () => {
await reader.scan();
reader.addEventListener("reading", ({ message }) => {
for (const record of message.records) {
if (record.recordType !== "smart-poster") continue;
const decoder = new TextDecoder();
for (const teil of record.toRecords()) {
switch (teil.recordType) {
case "url":
console.log("URL:", decoder.decode(teil.data));
break;
case "text": {
const textDecoder = new TextDecoder(teil.encoding);
console.log(`Titel (${teil.lang}):`, textDecoder.decode(teil.data));
break;
}
case ":act":
console.log("Aktion:", teil.data.getUint8(0));
break;
}
}
}
});
};
// Muss durch eine Nutzeraktion ausgelöst werden
document.querySelector("#scan").addEventListener("click", leseSmartPoster);
Externen Typ mit verschachtelten Datensätzen schreiben und lesen
// Schreiben: externer Typ mit eingebetteten Datensätzen
const schreibeProfil = async () => {
const writer = new NDEFReader();
await writer.write({
records: [{
recordType: "example.com:profil",
data: {
records: [
{ recordType: "text", data: "Anna" },
{ recordType: "url", data: "https://example.com/anna" }
]
}
}]
});
};
// Lesen: eingebettete Datensätze wieder zerlegen
const verarbeite = (record) => {
if (record.recordType === "example.com:profil") {
const [name, link] = record.toRecords();
const decoder = new TextDecoder();
console.log(decoder.decode(name.data), decoder.decode(link.data));
}
};
Fehler bei nicht unterstütztem Typ abfangen
const sichereEintraege = (record) => {
try {
return record.toRecords();
} catch (err) {
if (err.name === "NotSupportedError") {
console.warn(`Typ "${record.recordType}" hat keine eingebetteten Datensätze.`);
return [];
}
throw err;
}
};
// z. B. mit einem Text-Datensatz
const textRecord = new NDEFRecord({ recordType: "text", data: "Hallo" });
console.log(sichereEintraege(textRecord));
// Wichtig · Fallstricke
- Browser-Unterstützung: Web NFC ist experimentell und derzeit nur in Chrome für Android (ab Version 89) verfügbar. Firefox, Safari und Desktop-Browser unterstützen die API nicht. Vorher mit
"NDEFReader" in windowprüfen. - Sicherer Kontext: Nur über HTTPS nutzbar.
scan()undwrite()erfordern eine Nutzeraktion und die NFC-Berechtigung. - Bei
"text","url","absolute-url","mime","empty"und"unknown"lösttoRecords()eineNotSupportedErroraus. Deshalb vorherrecordTypeprüfen oder den Aufruf mittry/catchabsichern. - Lokale Typen (beginnen mit
:) sind nur innerhalb eines übergeordneten Datensatzes erlaubt, nicht auf oberster Ebene einer Nachricht. - Daten von NFC-Tags stammen aus einer nicht vertrauenswürdigen Quelle: URLs und Texte vor der Anzeige prüfen und niemals ungeprüft per
innerHTMLeinfügen (XSS-Gefahr).