file handling api无法使pwa自动成为系统默认程序,仅支持用户手动在系统设置中指定后响应文件打开请求;需严格配置manifest.json的file_handlers、通过launchqueue处理文件,且仅chromium桌面版稳定支持。

File Handling API 不能让你的 PWA 自动变成系统默认程序,它只负责“被选中后正确响应”——用户必须手动在 Windows 设置或 macOS 右键菜单里点一次“用此应用打开”,后续双击才会触发你的 launchQueue。
manifest.json 的 file_handlers 必须严格校验格式
浏览器只在解析 manifest.json 时读取 file_handlers,错一个字段就完全失效。常见问题包括:
-
action值必须是相对根路径(如"/open"),不能写成"open.html"或带协议的绝对 URL -
accept中的 MIME 类型键支持通配符(如"image/*"),但实际匹配依赖操作系统上报的类型——Windows 把.heic报成image/heic,而 Chrome 当前不认这个,只能显式写{"image/heic": [".heic"]} - 同一
accept对象里混写不兼容类型(比如{"text/plain": [".txt"], "application/json": [".json"]})语法合法,但部分系统会忽略后项 -
manifest.json必须通过<link rel="manifest" href="/manifest.json">显式声明,且服务器返回 MIME 类型为application/manifest+json
launchQueue 只在 OS 启动时存在,不是页面加载事件
用户双击文件 → 系统拉起已安装 PWA → 浏览器新开一个上下文执行 JS,此时 launchQueue 才可用。它不会出现在普通刷新、导航或 Service Worker 激活中。
- 别在
DOMContentLoaded或window.onload里检查'launchQueue' in window——这时候一定为false - 重复调用
launchQueue.setConsumer()不会报错,但第二次及之后的调用被静默忽略,导致后续文件无法处理 -
file是FileSystemHandle,不是Blob;必须先await file.getFile()才能读内容,否则抛TypeError: getFile is not a function -
launchParams.files只存在于setConsumer回调参数里,其他地方访问是undefined
Chrome / Edge 桌面版是目前唯一稳定支持的环境
Firefox 和 Safari 完全不支持 file_handlers 和 launchQueue;Android 和 iOS 的 PWA 也不支持——这是纯桌面 Chromium 特性。
- 即使 manifest 配置正确,用 Chrome for Android 打开
.txt文件,也不会触发你的 PWA - Windows 上测试需确保:PWA 已通过 Chrome/Edge “安装为应用”,且在系统设置中手动设为某扩展名的默认程序
- macOS 上需右键文件 → “显示简介” → “打开方式”选你的 PWA → 点“全部更改”,否则双击无反应
- 开发调试时,可临时用命令行启动 Chrome 并强制启用实验性支持:
chrome --unsafely-treat-insecure-origin-as-secure="http://localhost:8080" --user-data-dir=/tmp/chrome-test --unsafely-allow-automation(仅限本地开发)
最容易被忽略的是:file_handlers 生效的前提不是代码写对了,而是用户已在系统层面完成一次“信任授权”。没有这一步,所有 JS 逻辑都永远不会运行——它不像 fetch 或 localStorage 那样只要代码存在就能触发,而更像一个需要操作系统盖章的门禁卡。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











