目前定位到的问题是 iOS10 以下的手机会出现如下情况:
加载时出现报错, 无法进入游戏.
-
Creator 版本:1.9.1
-
目标平台: 微信小游戏
-
详细报错信息,包含调用堆栈:
-
重现方式:目标手机以任何方式打开对应的微信小游戏体验版均可重现
-
之前哪个版本是正常的 :暂无正常记录
-
手机型号 :iPhone 5 (iOS9.1) / iPad Mini (iOS8.4)
-
手机浏览器 :微信 6.6.6 / 微信 6.6.7 (微信目前最新版本 6.6.7)
-
编辑器操作系统 :Win10
-
编辑器之前是否有其它报错 :暂无相关报错
-
出现概率:100%
-
额外线索:
附带跟踪历程:
- 根据报错给的提示, this.doc.xxxxxx is not function 的使用位置在 libs/xmldom/dom-parser.js 的 112 和 119 行, 是 DOMHandler 的 prototype 方法.
- 经过全局搜索, 定位到 DOMHandler 是在 parseFromString (DOMParser 的唯一一个 prototype 方法) 里面作为临时变量实例的.
- 在 parseFromString 中, DOMHandler 实例后被赋值到 XMLReader.domBuilder 属性, 并于调用 XMLReader.parse 方法时, 才调用了 DOMHandler.startDocument.
- 此时, DOMHandler.doc (即报错中提及的 this.doc) 才被语句 new DOMImplementation().createDocument(null, null, null) 赋值 (createDocument 方法里面使用了this, 不知是不是因为如此才使用 new 关键字来调用的.).
- 根据 createDocument 中的 var doc = new Document(); 和 return doc; ,显然 doc 就是个 Document 对象, 在 Document.prototype 里面带着很多的属性和方法(包括报错提及到 not function 的方法), 而且根据 _extends(Document,Node); 还有来自 Node 的属性和方法.
那到底是何种原因才会导致 this.doc 不为空的情况下, 而 this.doc 的 prototype 方法却无法调用呢, 查找了全局也没有发现有任何代码重新赋值了 .doc , 或者重写了 Document 的 prototype .
而且只有部分系统才出现这个问题, 到底是其他系统没调用到这边的逻辑还是什么原因, 按道理 jsvm 应该由微信内部实现, 不会触碰到系统, 应该能抚平系统的差异才对的, 完全没有头绪.
也尝试过往上层跟踪:
- 启动时, DOMParser 由 game.js 赋值到全局, 再由 cocos2d-js.js 的 mudule[152] 封装成 cc.SAXParser 及其子类 cc.PlistParser 里面的 parse 方法之中, 并构造赋值到 cc 命名空间 (cc.saxParser / cc.plistParser).
- 其中只有 cc.plistParser.parse 被 mudule[133] (这个模块应该是 Pipeline.Loader) 的 loadPlist 方法调用, loadPlist 随后也被放到 map 中供 handle 使用.
感觉已经离答案不远了, plist 就是粒子效果的储存文本, 应该就是加载粒子效果并解析文本的时候出现的问题.
结果: 去除预设体上所有依赖的粒子文件, 目标设备运行, 正常加载进入游戏.
(吐槽)
原本是求助贴, 写着写着又发现了新的线索, 结果最后成功回避到问题了, 可是还是无法根本解决, 改成反馈帖吧, 水平有限, 不知分析是否有误, 各位大佬请用力吐槽.





