Android WebView中Autodesk Forge Viewer离线流程运行异常求助
Cannot read property 'Initializer' of undefined 我按照《Autodesk disconnected Workflow》文档尝试在Android手机上运行Forge Viewer,将GitHub上的forge-disconnected项目作为本地HTTPS服务器运行,并对Server.js文件做了如下修改以配置HTTPS:
const express = require('express'); var https = require('https'); const path = require('path'); const fs = require('fs'); let app = express(); app.use(express.static(path.join(__dirname, 'public'))); app.use(require('./routes/auth')); app.use(require('./routes/data')); var options = { key: fs.readFileSync(path.join(__dirname, 'cert', 'myKey.key')), cert: fs.readFileSync(path.join(__dirname, 'cert', 'myCer.cer')) }; https.createServer(options,app).listen(1880);
在Android应用的Chrome WebView中访问该服务器URL时,出现以下错误:
[chromium] [INFO:CONSOLE(20)] "Uncaught TypeError: Cannot read property 'Initializer' of undefined", source: https://example.com:1880/javascript/main.js (20)
但该服务在本地电脑浏览器(HTTPS方式)中可正常运行。我的Android设备系统版本为8.0.0,请问该错误的原因是什么?
原因分析与解决方案
核心原因
这个错误本质是Forge Viewer的核心脚本未被正确加载,导致Initializer对象不存在,根源在于Android 8.0 WebView的环境限制:
TLS版本兼容性问题
Android 8.0(API 26)默认仅支持TLS 1.0/1.1,而你的HTTPS服务器可能配置了更高版本的TLS(如TLS 1.2+)。当WebView尝试加载Viewer相关资源时,TLS版本不匹配会导致请求失败,核心脚本加载中断,最终触发Initializer未定义的错误。电脑浏览器普遍支持高版本TLS,所以能正常运行。自签名证书信任问题
你使用的是自签名证书,Android 8.0的WebView默认不会信任这类非CA颁发的证书。WebView请求资源时会因证书验证失败而终止加载,进而引发脚本错误。WebView必要设置缺失
Android WebView默认可能禁用了Dom存储、JavaScript高级特性等Forge Viewer依赖的功能,也会间接导致加载失败。
解决方案
- 强制WebView支持TLS 1.2+
在Android代码中为WebView配置TLS 1.2支持,示例代码:
import android.os.Build; import android.webkit.SslError; import android.webkit.SslErrorHandler; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import javax.net.ssl.SSLContext; // 初始化WebView时添加配置 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { WebSettings webSettings = webView.getSettings(); webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); try { SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(null, null, null); } catch (Exception e) { e.printStackTrace(); } webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 仅测试环境使用,生产环境请勿忽略证书错误 handler.proceed(); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); // 可在此记录资源加载失败日志 } }); }
- 处理自签名证书
- 测试环境:通过上述
onReceivedSslError方法中的handler.proceed()跳过证书验证(注意:生产环境禁止此操作,会引发安全风险)。 - 生产环境:将自签名证书导入Android系统信任库,或更换为受公共CA颁发的合法证书。
- 配置WebView必要权限
确保WebView启用Forge Viewer依赖的核心功能:
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); webSettings.setAllowContentAccess(true);
- 验证资源加载状态
开启WebView调试模式,查看Network面板确认所有Viewer相关脚本(如viewer3D.min.js)是否成功加载,根据具体加载失败信息进一步排查。
内容的提问来源于stack exchange,提问作者Randi

