Skip to content
bang edited this page Mar 29, 2017 · 7 revisions

JSPatch 建了一个交流群,总结一下群里问的问题,主要分几类:

  1. 直接贴一坨代码说没效果,怎么回事。大部分是直接用 JSPatch Convertor 转换后没修改直接运行的。
  2. 文档可以搜到的问题,例如对swift支持怎样,带_下划线的方法怎么调用,stringWithFormat怎么调用等。
  3. 文档搜不到,但换种方式可以搜到或找到的问题,例如 NSClassFromString 怎么调用,JS 数组/字典对象问题等。
  4. 一些难以发现或排查的问题,例如block多次传递,死锁。

实际上只有第四种问题才是值得回答的,其他三种可以说是伸手党,对于这三种问题,希望可以通过这篇文档自行找到解决方法。

JSPatch Convertor

如果你直接运行用 JSPatch Convertor 转换出来的代码,多半是不会成功运行的。因为这个工具有一些特性不支持,例如宏/静态变量/枚举/私有变量等,在工具下方有说明支持的和不支持的特性。对于这些不支持的特性,需要人工修改,具体怎样修改,参见:

宏/静态变量/枚举
私有变量
C 函数调用
Struct支持
GCD调用

如何调试

如果一个JSPatch脚本没有达到预期效果,怎样进行调试?

1.执行内容

首先确定执行的脚本文件是正确的,可以在 JPEngine.m 的 -evaluateScriptWithPath: 方法里断点看看。

2.JS语法

然后如果执行的 JS 脚本本身语法有问题,就会立即中 Assert (debug阶段crash,release阶段没事)。如果你debug 时看到 crash 提示 SyntaxError: Unexpected identifier …,就是 JS 脚本语法有问题,一般会提示哪个位置有问题,根据它的提示排查就行了。也可以把整个脚本复制到 Chrome / Safari 的 console 控制台执行,有语法问题会立即提示错误。

3.JS运行时错误

JS 脚本语法没有问题后,接下来就是运行时错误,找不到变量,调用方法不存在之类,这些问题在 JSPatch 引擎里也设计成中 Assert。对这类问题的排查就跟平时写程序排查一样了,可以遵循以下步骤:

  • 人肉看代码,看能不能直接看出问题,前提是大致看过 JSPatch 的文档,知道大概的一些规则,例如私有变量/静态变量不能直接拿,方法里的_要替换成__等等。
  • 如果找不到,就打log,在不同位置打log,先确定有没有执行到打log的位置,确定发生问题的代码段,缩小人肉看代码的范围。
  • 如果有必要,就通过 safari 进行断点调试。

4.其他

JS运行没问题,还是没效果,或者效果跟想象不一样,这时首先确定 JS 脚本替换的方法是不是在脚本执行之前就已经执行了,所以导致看到的效果是替换前的。其他问题就要查文档了。

如何查文档

经过调试后你知道了问题出在哪里,但不知道 JSPatch 对这个问题的处理和规则是什么,就先查文档。

可以通过google搜索这个项目的 wiki 文档和 issue 记录,像这样:

https://www.google.com.hk/search?q=私有变量%20site%3Agithub.com%2Fbang590%2FJSPatch

把其中的关键字 {私有变量} 替换成你想问的问题就可以了。大部分问题可以搜到答案,例如 stringWithFormat 怎么调用方法里有_下划线怎么替换swift 支持怎样webview有问题,等等。有些问题如果搜不到答案可以尝试转换描述,例如 NSClassFormString() 这个函数怎么调,可能搜不到答案,但这是个 C 函数,直接搜 C函数怎么调 就行了。

另外一些常见问题会放到这篇文档里,建议先看一下其中的 字符串 / 数组 / 字典 操作问题for … in 这两节,这是被问得最多的问题。

如果上述步骤都尝试过仍没有解决问题,欢迎在群上提问。

如何提问

提问前请确保自己进行过上述尝试,这样可以提出明确的问题,不会问“为什么没效果”,“这段代码有什么问题”这样伸手党的问题。可以描述自己做过哪些调试和尝试,具体哪里碰到了问题,同时带上足够的信息(代码 & 调试结果 & 崩溃堆栈)。

JSPatch报错信息:

  • 如果你使用的是JSPatchSDK,JS代码发生错误大部分情况并不会崩溃,但是完全没有效果不生效,JSPatch会把错误信息打印在控制台进行输出,如果你控制台内容太多,太难寻找,你可以使用[JPEngine handleException:^void(NSString *log){ }]这个接口接管JSPatch报错信息,保存进行查看
  • 如果你是用的是JSPatch源码,JS代码发生错误会第一时间断言崩溃,可以定位相应的崩溃堆栈,辅助查找问题

P.S. 如果你用的是 JSPatch 平台的 SDK,可以参照这篇文档

Clone this wiki locally