错误排查
如果下发脚本没有生效,可以根据以下文档排查问题。
JS 脚本问题
发现问题
如果 JS 脚本执行出错,XCode 控制台会打出错误日志,但仅靠错误日志可能难以发现,建议在 +startWithAppKey:
之前加入以下代码:
[JSPatch setupCallback:^(JPCallbackType type, NSDictionary *data, NSError *error) {
if (type == JPCallbackTypeJSException) {
NSAssert(NO, data[@"msg"]);
}
}];
这样在 debug 阶段 JS 脚本执行错误时会中 assert,马上可以看到错误信息。
确定 JS 脚本书写正确
可以用JS语法检查工具检查最终的 JS 脚本有没有语法问题。请按照 github wiki 里的规则写 JSPatch 脚本。
写完 JS 脚本后先在本地用 +testScriptInBundle
接口执行脚本看有没有问题,(详情参照使用范例),若没达到预期效果,可以一步步调试,第一步请在 main.js
开头打 console.log('run success')
,确定 XCode 控制台有输出这条 log,确定脚本有被执行到,再进行其他调试。一般调试使用 console.log()
就足够,若有更多需求可以用 Safari断点调试。
附几个常犯的错误:
- 不能用
NSLog('xx')
,应该用console.log('xx')
- get property 记得加括号,例如
self.navigationItem()
,而不是self.navigationItem
- 私有成员变量要用
self.valueForKey()
和self.setValue_forKey()
接口存取。 - block 里不能直接使用
self
配置问题
接入 SDK 1.6.6 以上版本,可以在控制台看到输出的log,例如:
2016-04-27 19:04:42.212 ... JSPatch: 尝试加载补丁
2016-04-27 19:04:42.399 ... JSPatch: 补丁已加载, 文件大小: 28
打出这两句 log 表示执行了脚本。
--
2016-04-27 19:04:42.399 ... JSPatch: sync请求: http://7xkfnf.com1.z0.glb.clouddn.com/6d2fddf24c5d8af2/1.0?v=1461755082.399732
2016-04-27 19:04:42.621 ... JSPatch: sync请求成功: {
v = 2;
}
这两句表示请求到了当前版本补丁版本号,这里 url 里的 6d2fddf24c5d8af2
是 appkey
,后续跟的 1.0
是 App 版本号,可以检查下这两个值是否正确。若 url 不正确或者脚本没有正确上传,这里会返回 error = "Document not found"
。
--
2016-04-27 19:09:43.798 ... JSPatch: 尝试更新补丁版本: 2
2016-04-27 19:09:43.798 ... JSPatch: 请求补丁文件: http://7xkfnf.com1.z0.glb.clouddn.com/6d2fddf24c5d8af2/1.0/file2
2016-04-27 19:09:43.900 ... JSPatch: 请求补丁文件成功,大小:3072
2016-04-27 19:09:43.908 ... JSPatch: 更新补丁版本 2 成功
这几句表示检测到的补丁版本号比本地版本更新,去下载补丁文件,下载后会立即执行,到这一步应该就没问题了。若这个版本的补丁之前已经下载过,就不会再下载。
--
若要看到更多信息,可以调用:
[JSPatch showDebugView];
调用后,在 statusBar 会出现 JSPatch 调试按钮:
点击后,会弹起显示 JSPatch 所有相关 log 以及脚本内容,方便调试问题:
有问题照上述点一个个检查,就可以解决了,这里会尽量列出可能会出现的问题,平台也会持续改进易用性。若还有问题,请查看 平台文档 以及 JSPatch 文档。