因为后端服务切换,线上有个版本可能会受到影响,奈何苹果审核周期太尼玛长啊,所以打算在不发布新版的情况修复问题。
因为之前老大有让了解一个叫做"JSPatch"的东西,当时为了应付老大(我是真正的懒),先植入到了版本中去了(现在想想真是万幸),但是对于JSPatch如何调用真是一点都不知道啊。
这不周一中午老大和我讲起这事情,下午就让我出个方案给他,前提就是使用JSPatch更新我们的代码。
好吧,废话不说,写完这遍我还要回家呢,女程序缓天天加班到现在,真是。。。
网上搜JSPatch,如上图,总体而言,都是差不多的,所以一些基本的东西里面我也不会列举出来了。首先分享两个工具。
1 想了解JSPatch的我建议还是先去官网看看,可点击我是官网。
2 觉得把OC转为JS很麻烦,可以通过这个工具点我点我,虽然转化后不一定准确,但是大部份还是OK的。
这次主要做的就是更换了原来代码的中两个方法(包含网络请求,Block回调)及插入一个新界面。基于原理你们都可以百度到,我就分享一下在写JS的过程中我遇到的几个问题吧,有些问题肯定很低级,谁让我是一个伪程序缓呢。其中这些问题也是在没有发现转换工具的时候遇到的,不过遇到了总归是好事情。
1 首先我是在Block那边卡了壳,当时也不知道有转换工具,因为我的网络请求牵涉到签名等问题,如你们所知,在JS里面进行签名那就是竹篮打水—一场空。后来还是通过JS回调OC斛决了签名问题。Block也进行了拆分完成,后来通过转换工具发现其实并不需要拆分。
2 字符串比较问题,当我用console.log输入一模一样的值时,比较后的结果却是不一样的逻辑,JS里面的“等于”是恒等于"==="的意思,但字符串却不是这样的,仍然和OC里面差不多
var a = 'hehe';
var b ='hehe';
console.log(a);
console.log(b);
if ( a.isEqualToString(b) ){
console.log('我们是一样的哦');
}
3 在构建的新界面上给Button添加方法时消磨了我不少时间,转化出来的为
sendBtn.addTarget_action_forControlEvents(self, @selector("onSendBtnClick:"), 64);
但是程序运行起来就崩溃啊,我真的讨厌崩溃,另外说一点,由于我不会断点在JS里面调试,都是通过console.log()输出,这样的效率真是太太太差了。
最后尝试了这样的方式,竟然OK了,btn.addTarget_action_forControlEvents(self, "onSendBtnClick:", 64);(64是指"UIControlEventTouchUpInside"对应的值,左移6位即2的6次方),在JS里面只能识别具体的值,是不是觉得JS很聪明呢。
在 iOS8 下,JSPatch 支持使用 Safari 自带的调试工具对 JS 脚本进行断点调试,听到这个消息是不是很开心伐,我一向是个爱分享的主儿,当然不会藏着喽,现在就分享出来:
启动调试工具
首先需要开启 Safari 调试菜单:Safari -> 偏好设置 -> 高级 -> 勾选[在菜单栏中显示“开发”菜单]
接着启动APP -> Safari -> 开发 -> 选择你的机器 -> JSContext
即可开始调试。
连接真机调试时,需要打开真机的web检查器:设置 -> Safari -> 高级 -> Web检查器
资源列表
资源列表列出了 JSPatch 所有执行中的脚本文件,点开文件后可以对其进行断点调试。
通过 [JPEngine evaluateScript:script] 接口执行的脚本,在资源列表里都表示为 main.js。
通过 [JPEngine evaluateScriptWithPath:filePath] 接口执行的脚本,在资源列表里会以原文件名表示。
4 获取屏宽
var viewFrame = self.view().frame();
var SCREEN_WIDTH = viewFrame.width;