You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:36:08