Manifest V3版Chrome扩展加载Unity3D游戏触发CSP script-src错误如何解决
问题根因
Chrome扩展Manifest V3默认的内容安全策略(CSP)中,extension_pages 域的 script-src 指令仅允许加载扩展包内的本地脚本('self'),禁止加载 blob: 协议的动态脚本。你当前的报错是Unity WebGL默认的动态加载逻辑会把框架代码封装为Blob URL插入页面,刚好触发了该限制。
可行解决方法
方案1:调整Manifest的CSP配置
在manifest.json中显式放开扩展页对blob脚本的加载权限,若Unity用到WebAssembly相关逻辑,建议额外配置sandbox页承载Unity运行环境,避免主扩展权限受影响:{ "manifest_version": 3, "content_security_policy": { "extension_pages": "script-src 'self' blob:; object-src 'self';", "sandbox": "sandbox allow-scripts allow-wasm; script-src 'self' 'unsafe-eval' blob:; object-src 'self';" }, // 配置Unity运行页为sandbox页面 "sandbox": { "pages": ["unity-game.html"] } }方案2:修改Unity WebGL构建配置,禁用Blob动态加载
打开Unity的Player设置,切换到WebGL平台标签,找到Publishing Settings分类,关闭Load Unity framework dynamically选项,开启Use Embedded Resources选项,构建后Unity会直接生成静态框架脚本文件,不会再动态创建Blob脚本,完全规避CSP冲突,是上架审核最稳妥的方案。方案3:直接修改Unity Loader代码
若不方便修改构建配置,可以直接替换你贴出的动态加载逻辑,弃用Blob URL,改为直接注入脚本内容,无需调整CSP即可正常运行:function f() { return d("frameworkUrl").then(function(e) { return new Promise(function(e, n) { var r = document.createElement("script"); // 直接写入脚本内容,不创建Blob URL r.textContent = e; r.onload = function() { var n = unityFramework; unityFramework = null, r.onload = null, e(n) }, document.body.appendChild(r), c.deinitializers.push(function() { document.body.removeChild(r) }) }) }) }
注意事项
不要在extension_pages的CSP中添加unsafe-inline、unsafe-eval等Manifest V3禁止的指令,会直接被应用商店驳回,若必须使用eval类能力,统一放到sandbox页中运行即可。
内容的提问来源于stack exchange,提问作者Stefan

