Signatur
Beschreibung
Die schreibgeschützte Eigenschaft recordType der Schnittstelle NDEFRecord gibt an, welche Art von Daten ein NDEF-Datensatz (NFC Data Exchange Format) enthält. Anhand dieses Werts entscheidet man, wie die Nutzdaten in record.data (ein DataView) auszuwerten sind, also etwa mit einem TextDecoder, als JSON oder als verschachtelte NDEF-Nachricht.
Mögliche Werte sind:
"empty": leerer Datensatz ohne Nutzdaten"text": Text (Well-known TypeT), dazu gehörenencodingundlang"url": URI (Well-known TypeU)"absolute-url": absolute URL als Typfeld (TNF absolute URI)"mime": MIME-Daten, der konkrete Typ steht inmediaType"smart-poster": Smart Poster (Well-known TypeSp) mit eingebetteten Datensätzen"unknown": Typ unbekannt (TNF unknown)- Externer Typ, z. B.
"example.com:meintyp"(Domain +:+ Typname) - Lokaler Typ, z. B.
":act". Er beginnt mit einem Doppelpunkt und kommt nur innerhalb verschachtelter Datensätze vor.
Beim Schreiben mit NDEFReader.write() wird derselbe Wert als Schlüssel recordType im Datensatz-Objekt angegeben. Lesen und Schreiben verwenden also dasselbe Vokabular.
Rückgabewert
"text", "url", "mime", "empty", "smart-poster", "unknown", "absolute-url" oder ein externer bzw. lokaler Typname.Beispiele
NFC-Tag lesen und nach recordType auswerten
const scanButton = document.querySelector('#scan');
scanButton.addEventListener('click', async () => {
if (!('NDEFReader' in window)) {
console.log('Web NFC wird nicht unterstützt.');
return;
}
const reader = new NDEFReader();
await reader.scan(); // erfordert Nutzergeste + Berechtigung
reader.addEventListener('reading', ({ message, serialNumber }) => {
console.log(`Tag ${serialNumber}`);
for (const record of message.records) {
switch (record.recordType) {
case 'text': {
const text = new TextDecoder(record.encoding).decode(record.data);
console.log(`Text (${record.lang}): ${text}`);
break;
}
case 'url': {
const url = new TextDecoder().decode(record.data);
console.log(`URL: ${url}`);
break;
}
case 'mime':
console.log(`MIME-Daten vom Typ ${record.mediaType}`);
break;
default:
console.log(`Anderer Typ: ${record.recordType}`);
}
}
});
});
JSON aus einem MIME-Datensatz lesen
const reader = new NDEFReader();
await reader.scan();
reader.onreading = ({ message }) => {
const jsonRecord = message.records.find(
(r) => r.recordType === 'mime' && r.mediaType === 'application/json'
);
if (jsonRecord) {
const daten = JSON.parse(new TextDecoder().decode(jsonRecord.data));
console.log(daten);
}
};
Tag mit verschiedenen recordType-Werten beschreiben
const writer = new NDEFReader();
await writer.write({
records: [
{ recordType: 'text', data: 'Willkommen!', lang: 'de' },
{ recordType: 'url', data: 'https://programmierung.net' },
{
recordType: 'mime',
mediaType: 'application/json',
data: new TextEncoder().encode(JSON.stringify({ id: 42 }))
},
// externer Typ: Domain + Doppelpunkt + Name
{ recordType: 'programmierung.net:kurs', data: new TextEncoder().encode('js-101') }
]
});
console.log('Tag beschrieben.');
Eingebettete Datensätze eines Smart Posters
const reader = new NDEFReader();
await reader.scan();
reader.onreading = ({ message }) => {
for (const record of message.records) {
if (record.recordType === 'smart-poster') {
const inner = record.toRecords(); // verschachtelte NDEFRecord-Objekte
inner.forEach((r) => console.log('Enthalten:', r.recordType));
}
}
};
// Wichtig · Fallstricke
- Browser-Unterstützung: Web NFC gibt es derzeit nur in Chrome bzw. Chromium-basierten Browsern unter Android (ab Version 89). Desktop-Browser, Firefox und Safari (auch iOS) unterstützen die API nicht. Verfügbarkeit daher immer mit
'NDEFReader' in windowprüfen. - Die API steht nur in sicheren Kontexten (HTTPS) und nur im obersten Browsing-Kontext zur Verfügung, nicht in fremden iframes.
scan()undwrite()erfordern eine Nutzergeste und die NFC-Berechtigung. recordTypeist schreibgeschützt. Eine Zuweisung hat keine Wirkung. Um den Typ festzulegen, gibt man ihn beim Konstruktornew NDEFRecord({ recordType, ... })oder beiwrite()an.- Bei
"mime"sagtrecordTypenichts über das tatsächliche Format aus. Maßgeblich istmediaType.encodingundlangsind nur bei"text"gesetzt, sonstnull. - Bei
"empty"istdatanull. Vor dem Dekodieren also prüfen. - Lokale Typen (beginnen mit
:) sind nur in eingebetteten Datensätzen erlaubt, etwa in einem Smart Poster. Auf oberster Ebene wirftwrite()einenTypeError. - Die Tag-Inhalte sind nicht vertrauenswürdig. Gelesene URLs und Texte nie ungeprüft per
innerHTMLeinfügen oder automatisch öffnen, sonst drohen XSS oder Phishing.