Start · Sprachen · JavaScript · Referenz · Window.launchQueue

Window.launchQueue

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>LaunchQueue</code>-Objekt liefert, mit dem eine installierte PWA ihre Startnavigation und geöffnete Dateien selbst verarbeitet.

seit JavaScript Experimentell: Chromium 102+ (Chrome, Edge); nicht Kategorie: webapi

Signatur

Window.launchQueue

Beschreibung

Die schreibgeschützte Eigenschaft window.launchQueue gibt ein LaunchQueue-Objekt zurück. Darüber übernimmt eine installierte Progressive Web App (PWA) selbst die Kontrolle darüber, wie sie gestartet wird. Die Eigenschaft gehört zur Launch Handler API und zur File Handling API.

Die einzige Methode ist launchQueue.setConsumer(callback). Der Callback bekommt bei jedem Start ein LaunchParams-Objekt. Darin stehen targetURL (die Adresse, mit der die App gestartet wurde) und files, ein Array aus FileSystemFileHandle-Objekten. files ist gefüllt, wenn der Nutzer die App über „Öffnen mit“ im Betriebssystem gestartet hat.

Richtig nützlich wird das mit dem Manifest-Feld launch_handler. Mit "client_mode": "focus-existing" oder "navigate-existing" öffnet ein neuer Start kein weiteres Fenster. Stattdessen wird ein vorhandenes Fenster fokussiert, und der Consumer empfängt die neuen Startparameter. Das passt zu Einzelfenster-Apps wie Musikplayern, Editoren oder Chat-Clients. Für die Dateiverarbeitung muss das Manifest zusätzlich file_handlers festlegen.

Startereignisse, die vor dem Aufruf von setConsumer() eintreffen, werden in der Warteschlange gepuffert und danach an den Consumer übergeben. Rufen Sie setConsumer() trotzdem möglichst früh beim Laden der Seite auf.

Rückgabewert

Typ
LaunchQueue
Beschreibung
Das LaunchQueue-Objekt des aktuellen Fensters. Es hat die Methode setConsumer(callback: (params: LaunchParams) => void). In Browsern ohne Unterstützung fehlt die Eigenschaft ganz ('launchQueue' in window ergibt false).

Beispiele

Unterstützung prüfen und Start-URL auswerten

// Manifest: "launch_handler": { "client_mode": "focus-existing" }
if ('launchQueue' in window) {
  window.launchQueue.setConsumer((launchParams) => {
    if (!launchParams.targetURL) return;
    const url = new URL(launchParams.targetURL);
    const track = url.searchParams.get('track');
    if (track) {
      console.log(`Spiele Titel ${track} im bestehenden Fenster ab`);
    }
  });
} else {
  console.log('Launch Handler API wird nicht unterstützt');
}
Spiele Titel 42 im bestehenden Fenster ab

Über das Betriebssystem geöffnete Dateien einlesen (File Handling)

// Manifest-Ausschnitt:
// "file_handlers": [{ "action": "/editor", "accept": { "text/markdown": [".md"] } }]
const editor = document.querySelector('#editor');

if ('launchQueue' in window) {
  window.launchQueue.setConsumer(async ({ files }) => {
    if (!files || files.length === 0) return;
    for (const handle of files) {
      const file = await handle.getFile();
      const text = await file.text();
      editor.value = text;
      document.title = `${file.name} – Editor`;
      console.log(`Geladen: ${file.name} (${file.size} Bytes)`);
    }
  });
}
Geladen: notizen.md (1532 Bytes)

Geöffnete Datei direkt zurückschreiben

let currentHandle = null;

window.launchQueue?.setConsumer(async ({ files }) => {
  if (files.length) currentHandle = files[0];
});

const saveFile = async (content) => {
  if (!currentHandle) return;
  // Schreibrecht wird ggf. beim Nutzer angefragt
  const writable = await currentHandle.createWritable();
  await writable.write(content);
  await writable.close();
  console.log('Gespeichert');
};
Gespeichert

// Wichtig · Fallstricke

  • Experimentell und nur in Chromium verfügbar (Chrome/Edge ab Version 102 auf dem Desktop). Firefox und Safari unterstützen die API nicht. Prüfen Sie deshalb immer mit 'launchQueue' in window oder dem optionalen Verkettungsoperator ?., ob sie vorhanden ist.
  • Die Eigenschaft wirkt nur in einer installierten PWA, die im eigenen Fenster läuft. In einem normalen Browser-Tab erhält der Consumer höchstens die aktuelle URL. files bleibt dort leer.
  • Nur ein sicherer Kontext (HTTPS oder localhost) ist erlaubt.
  • Ein erneuter Aufruf von setConsumer() ersetzt den bisherigen Consumer. Registrieren Sie den Consumer daher nur einmal und zentral.
  • targetURL kann von außen beeinflusst werden, etwa über Links oder Verknüpfungen. Prüfen Sie Abfrageparameter deshalb, bevor Sie sie z. B. in das DOM einfügen (XSS-Gefahr bei innerHTML).
  • Für das Schreiben in übergebene Dateien fragt der Browser den Nutzer eventuell um Erlaubnis.