tl;博士
本质上,我需要设置 COOP/COEP 标头以在我的 Capacitor v3 iOS 应用程序中启用 SharedArrayBuffer 功能,并且运行 ServiceWorker 来设置标头是我迄今为止找到的唯一解决方案。
问题的背景
Chrome Android 和 Safari iOS现在都支持 SharedArrayBuffer ,这意味着 Ffmpeg.wasm 可以利用多线程。SharedArrayBuffer 需要一个安全的上下文来启用功能,这是通过设置以下标头来完成的;
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
进一步的要求;
- 该站点需要通过 HTTPS 或 localhost 提供服务
- 标头必须设置在服务器端(标头不能
meta http-equiv=".."
在 head 标签中设置)
我在 Capacitor 中发现了这个问题来实现。我的应用程序是自包含的(应用程序文件在本地提供),它不需要外部 http 请求来提供应用程序文件。这意味着在服务器端设置所需的标头不是一种选择。
变通解决方案
以下解决方案建议使用 ServiceWorker 在客户端设置 COOP/COEP 标头,这正是我所需要的。在不接触服务器的情况下启用 COOP/COEP
问题
ServiceWorkers 有自己的一套要求,这就是我遇到的问题。
为了在 iOS 上启用这个 ServiceWorker API,我正在使用App-Bound Domains。
github Support 中的以下问题将具有电容器的 PWA 部署为本机应用程序概述了在电容器中实现应用程序绑定域所需的步骤。
其中包括;
添加您的域列表,包括。server.hostname / localhost 到 Info.plist。
limitsNavigationsToAppBoundDomains
在您的 src 中启用-capacitor/capacitor.config.json
设置应用绑定域后,我会出现以下错误;
serviceWorker.register() must be called with a script URL whose protocol is either HTTP or HTTPS
发生这种情况是因为 Capacitor 应用程序是capacitor://
在 iOS 中提供的。
有没有办法解决?(不需要从远程 url 提供服务)。
或者有没有人发现在 Capacitor 中设置 COOP/COEP 标头客户端的更好方法?
谢谢凸轮