概述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 });

})());

}

});

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部