From 391777fdb4e5bfecc8ae5e4397b9a4d1aac0dd83 Mon Sep 17 00:00:00 2001 From: Eduard Wisch Date: Thu, 9 Apr 2026 01:10:05 +0200 Subject: [PATCH] fix: Web Share Target akzeptiert mehr Feldnamen (Android Gallery Varianten) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verschiedene Android-Gallery-Apps senden geteilte Bilder unter unterschiedlichen Feldnamen — photos, file, files, image, images. - Manifest listet jetzt alle drei Haupt-Feldnamen mit image/* accept - Service Worker iteriert alle bekannten Keys UND macht einen Fallback über alle FormData-Entries für unbekannte Gallery-Apps - Cache-Version v6 damit Browser Manifest neu liest Wichtig: PWA muss nach diesem Update einmal deinstalliert und neu installiert werden, damit Android das neue share_target registriert. Co-Authored-By: Claude Opus 4.6 (1M context) [deploy] --- manifest.webmanifest | 5 ++++- sw.js | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/manifest.webmanifest b/manifest.webmanifest index 4813f86..b2853d6 100644 --- a/manifest.webmanifest +++ b/manifest.webmanifest @@ -20,8 +20,11 @@ "params": { "title": "title", "text": "text", + "url": "url", "files": [ - { "name": "photos", "accept": ["image/jpeg", "image/png", "image/webp"] } + { "name": "photos", "accept": ["image/*"] }, + { "name": "file", "accept": ["image/*"] }, + { "name": "files", "accept": ["image/*"] } ] } } diff --git a/sw.js b/sw.js index 9f79708..60622e7 100644 --- a/sw.js +++ b/sw.js @@ -4,7 +4,7 @@ * - API-Calls: network-first, kein offline-cache (da auth-pflichtig) */ -const CACHE = 'baustelle-v5'; +const CACHE = 'baustelle-v6'; const SHELL = [ './', './index.html', @@ -23,7 +23,19 @@ const SHELL = [ // Web Share Target: eingehende POSTs an share.html abfangen und in IDB zwischenspeichern async function handleShareTarget(request) { const fd = await request.formData(); - const files = fd.getAll('photos'); + // Alle bekannten Feldnamen durchprobieren — verschiedene Android-Gallery-Apps + // nutzen unterschiedliche Namen + let files = []; + for (const key of ['photos', 'file', 'files', 'image', 'images']) { + const v = fd.getAll(key); + if (v && v.length) files = files.concat(v); + } + // Fallback: alle File-Entries im FormData durchsuchen + if (!files.length) { + for (const [k, v] of fd.entries()) { + if (v && typeof v === 'object' && v.size !== undefined) files.push(v); + } + } if (files.length) { const db = await new Promise((res, rej) => { const req = indexedDB.open('baustelle-pwa-v1', 1);