2018.11.05

最常见错误分析

1. undefined 级错误

分布系统及机型
system: android 5.0~8.0
可能原因
兼容性问题,获取事件DOM节点时,error.target.localName在部分安卓浏览器环境为空。
解决方案一
增加error.srcElement.localName,增加事件源捕获范围

  1. // 资源加载错误
  2. else if (error instanceof <any>Event) {
  3. let _target = error.target.localName ? error.target : error.srcElement
  4. errorTarget:string = _target.localName
  5. filename:string = _target.src || _target.href
  6. }

2. Script error. js报错

分布系统及机型:
system: android ios均有
原因:跨域脚本同源安全策略导致,上线前为规避此问题,已经在脚本上加上了crossorigin字段,但仍然有部分机器出现。初步诊断,分析样本发现,用户在wifi环境下会出现这个错误,4g环境比较少。
推测1: 可能是用户运营商网络被劫持,加载了第三方脚本,脚本运行报错。
推测2: 目前只有业务代码js增加了crossorigin头,head区域内的公共库没有增加属性,可能原因:微信的sdk.js使用腾讯官方cdn地址,不同源;exception.js本身报错,未加crossorigin。

webkit源码:

  1. bool ScriptExecutionContext::sanitizeScriptError(String& errorMessage, int& lineNumber, String& sourceURL)
  2. {
  3. KURL targetURL = completeURL(sourceURL);
  4. if (securityOrigin()->canRequest(targetURL))
  5. return false;
  6. errorMessage = "Script error.";
  7. sourceURL = String();
  8. lineNumber = 0;
  9. return true;
  10. }

3. WeixinJSBridge is not defined 微信js桥错误

分布系统及机型
system: android 5.0~8.0
可能原因
安卓微信webview注入钩子有时序问题,在WeixinJSBridge还未注入之前,就已经成功注入其它依赖于WeixinJSBridge的其它API模块。在API模块中调用WeixinJSBridge就会失败。目前图书馆项目调用桥接器的只有分享功能。
解决方案
在ready之后业务代码作为callback。有风险:WeixinJSBridge注入失败,导致callback不执行。

4. 代码逻辑错误

未发现重大错误,部分机器有数据类型错误,如:全局环境下没有console,localStorage等window属性,js数据类型null/undefined。

版本优化方案(1.1.0)

  • 新增IP字段和城市字段
  • 项目静态资源地址公用库使用内部CDN地址,都配置跨域
  • 安卓分享callback放在桥接器ready内执行
  • 后端控制钉钉消息频率,1分钟内累计10次以上进行预警。