Start · Sprachen · JavaScript · Referenz · NDEFRecord.recordType

NDEFRecord.recordType

Eigenschaft

Schreibgeschützte Zeichenkette mit dem Typ eines NDEF-Datensatzes, z. B. <code>"text"</code>, <code>"url"</code>, <code>"mime"</code> oder ein externer Typ.

seit JavaScript Web NFC — Chrome für Android 89+ (experimentell, k Kategorie: webapi

Signatur

NDEFRecord.recordType

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 Type T), dazu gehören encoding und lang
  • "url": URI (Well-known Type U)
  • "absolute-url": absolute URL als Typfeld (TNF absolute URI)
  • "mime": MIME-Daten, der konkrete Typ steht in mediaType
  • "smart-poster": Smart Poster (Well-known Type Sp) 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

Typ
string
Beschreibung
Der Typ des Datensatzes als Zeichenkette, z. B. "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}`);
      }
    }
  });
});
Tag 04:a2:3f:1c:5e:61:80 Text (de): Hallo NFC URL: https://programmierung.net

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);
  }
};
{ raum: "B204", sitzplatz: 12 }

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.');
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));
    }
  }
};
Enthalten: url Enthalten: text Enthalten: :act

// 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 window prüfen.
  • Die API steht nur in sicheren Kontexten (HTTPS) und nur im obersten Browsing-Kontext zur Verfügung, nicht in fremden iframes. scan() und write() erfordern eine Nutzergeste und die NFC-Berechtigung.
  • recordType ist schreibgeschützt. Eine Zuweisung hat keine Wirkung. Um den Typ festzulegen, gibt man ihn beim Konstruktor new NDEFRecord({ recordType, ... }) oder bei write() an.
  • Bei "mime" sagt recordType nichts über das tatsächliche Format aus. Maßgeblich ist mediaType. encoding und lang sind nur bei "text" gesetzt, sonst null.
  • Bei "empty" ist data null. 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 wirft write() einen TypeError.
  • Die Tag-Inhalte sind nicht vertrauenswürdig. Gelesene URLs und Texte nie ungeprüft per innerHTML einfügen oder automatisch öffnen, sonst drohen XSS oder Phishing.