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

IOS 11 WKWebView中创建Ionic Worker遇SecurityError (DOM Exception 18)

解决iOS 11.0.3中创建Worker时的SecurityError (DOM Exception 18)问题

针对你在iOS 11.0.3里创建PDF处理Worker时遇到的这个安全错误,我结合iOS WebKit的特性和Worker的安全规则,给你几个针对性的排查和解决方向:

  • 检查加载协议与同源策略
    iOS 11的WebKit对file://协议的限制非常严格,如果你是直接本地打开HTML文件(而非通过HTTP/HTTPS服务器),创建Worker会触发这个安全错误。因为file://环境下不存在同源概念,WebKit会默认阻止这类跨域风险操作。解决办法是把页面和Worker脚本部署到HTTP/HTTPS服务器上,哪怕是本地的开发服务器(比如Node.js的http-server、Python的SimpleHTTPServer)都可以。

  • 验证Worker脚本的路径与MIME类型
    确保scripts/pdfmake-worker-blob.js的路径是正确的,服务器返回这个文件时的MIME类型是application/javascript(或text/javascript)。iOS WebKit对脚本资源的MIME类型检查比桌面端更严格,如果返回的类型不正确,也可能触发安全拦截。

  • 改用Blob URL方式加载Worker
    从文件名pdfmake-worker-blob.js来看,这个脚本可能原本就是为Blob加载设计的。你可以尝试先获取脚本内容,转为Blob对象再创建Worker,这种方式能绕过某些路径相关的安全限制:

    // 先获取Worker脚本内容
    fetch('scripts/pdfmake-worker-blob.js')
      .then(res => res.text())
      .then(workerCode => {
        // 创建Blob并生成URL
        const workerBlob = new Blob([workerCode], { type: 'application/javascript' });
        const blobUrl = URL.createObjectURL(workerBlob);
        const pdfWorkerBlob = new Worker(blobUrl);
    
        // 记得在Worker不再使用时释放Blob URL资源
        pdfWorkerBlob.onterminate = () => {
          URL.revokeObjectURL(blobUrl);
        };
      })
      .catch(err => console.error('加载Worker脚本失败:', err));
    
  • 检查页面的Content-Security-Policy (CSP)
    如果你的页面设置了CSP头,需要确保worker-src指令包含了Worker脚本的来源。比如如果脚本和页面同域,需要在CSP中添加worker-src 'self';,否则浏览器会阻止创建Worker的操作。

  • iOS 11.0.x版本的特定Bug
    iOS 11.0到11.0.3之间的WebKit存在一些Worker相关的已知问题,比如相对路径加载的兼容性问题。你可以尝试使用绝对路径(比如/scripts/pdfmake-worker-blob.js)来创建Worker,或者考虑升级iOS版本到11.1及以上,看看是否能解决这个问题。

内容的提问来源于stack exchange,提问作者Novy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:54