概述Web Share Target 允许应用成为系统分享目标。本文展示 manifest 配置与 SW 接收处理并持久化。Manifest 配置(示例){
"share_target": {
"action": "/share",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"files": [{ "name": "files", "accept": ["*/*"] }]
}
}
}
Service Worker 接收并持久化self.addEventListener('fetch', event => {
const url = new URL(event.request.url);
if (url.pathname === '/share' && event.request.method === 'POST') {
event.respondWith((async () => {
const fd = await event.request.formData();
const title = fd.get('title') || '';
const text = fd.get('text') || '';
const files = fd.getAll('files');
const db = await new Promise((res, rej) => { const r = indexedDB.open('share', 1); r.onupgradeneeded = () => { const db = r.result; if (!db.objectStoreNames.contains('items')) db.createObjectStore('items', { autoIncrement: true }); }; r.onsuccess = () => res(r.result); r.onerror = () => rej(r.error); });
const tx = db.transaction('items','readwrite');
tx.objectStore('items').add({ title, text, ts: Date.now() });
for (const f of files) tx.objectStore('items').add({ fileName: f.name, type: f.type, size: f.size, ts: Date.now() });
await new Promise((res, rej) => { tx.oncomplete = res; tx.onerror = () => rej(tx.error); });
db.close();
return new Response('', { status: 201 });
})());
}
});

发表评论 取消回复