跳转到内容

Manifest share_target

一句话: share_target 将已安装的 PWA 注册到系统原生分享菜单,让其他应用可以直接向你的应用分享 URL、文本、标题与文件。在 Android 和 Windows 上,系统以 GET 或 POST 请求的形式将分享数据发送到你指定的 URL——再由你的 Service Worker 或页面处理器处理。

语法——分享文本、URL 与标题(GET)

Section titled “语法——分享文本、URL 与标题(GET)”
{
"share_target": {
"action": "/app/share-handler",
"method": "GET",
"params": {
"title": "title",
"text": "text",
"url": "url"
}
}
}

当用户将内容分享到你的应用时,浏览器会导航至:

/app/share-handler?title=<分享标题>&text=<分享文本>&url=<分享URL>
{
"share_target": {
"action": "/app/share-handler",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "media",
"accept": ["image/*", "video/mp4"]
}
]
}
}
}

文件分享需要 "method": "POST""enctype": "multipart/form-data"files 数组列出接受的 MIME 类型。

属性 是否必填 说明
action 接收分享数据的域内 URL,必须位于 scope 之内。
method "GET"(默认)或 "POST"。文件分享须用 POST。
enctype POST 请求体的编码方式。设置 files 时必须为 "multipart/form-data"
params.title 分享标题字符串的查询参数名。
params.text 分享文本字符串的查询参数名。
params.url 分享 URL 的查询参数名。
params.files 定义接受文件类型的 {name, accept} 对象数组。

action 必须位于清单 scope 之内。若不满足,浏览器会完全忽略 share_target

页面加载时从 URL 读取查询参数:

const params = new URLSearchParams(location.search);
const sharedUrl = params.get('url');
const sharedText = params.get('text');

在 Service Worker 中拦截 POST 请求并将数据传递给客户端:

service-worker.js
self.addEventListener('fetch', (event) => {
if (event.request.method === 'POST' &&
event.request.url.includes('/share-handler')) {
event.respondWith((async () => {
const data = await event.request.formData();
const files = data.getAll('media');
// 缓存或转发文件,然后重定向到应用
return Response.redirect('/app/editor', 303);
})());
}
});
平台 支持情况
Android(Chrome 76+) GET 与 POST(含文件)
Windows(Edge 79+) GET;POST 文件支持有限
iOS(Safari) 不支持
macOS(Chrome/Edge) 不支持
  • action URL 位于清单 scope 之内。
  • 文本/URL 分享时,查询参数名与页面读取的参数名一致。
  • 文件分享时,method"POST"enctype"multipart/form-data",且已列出接受的 MIME 类型。
  • Service Worker 能处理 POST 请求并在处理完成后进行重定向。
  • 已在 Android 上测试从其他应用(如系统浏览器)分享到 PWA 的流程。
  • 当查询参数缺失或文件列表为空时,处理器能优雅降级。