JSPatch 热更新框架的个人评估
2015年07月08日
实现原理
实现就看作者本人博客,写得非常详细;
JSPatch 介绍
JSPatch实现原理
兼容性
因为使用了 JavaScriptCore.Framework,所以只支持 iOS7.0
以及以后。
安全性
JSPatch让脚本语言获得调用所有原生OC方法的能力,不像web前端把能力局限在浏览器,使用上会有一些安全风险:
1
.若在网络传输过程中下发明文JS,可能会被中间人篡改JS脚本,执行任意方法,盗取APP里的相关信息。可以对传输过程进行加密,或用直接使用https解决。
2
.若下载完后的JS保存在本地没有加密,在未越狱的机器上用户也可以手动替换或篡改脚本。这点危害没有第一点大,因为操作者是手机拥有者,不存在APP内相关信息被盗用的风险。若要避免用户修改代码影响APP运行,可以选择简单的加密存储。
3
容错性差。随意注入 不能正确执行的JS 代码就会造成crash。
优点
1
框架轻便小巧。
2
可以进行简单的热修复,实时的修复一些简单的 bug。
3
可以远程访问,也可以存本地。
4
基本的类型都已经支持,包括 GCD,block,协议,动画等。
缺点
1
.没有 IDE支持,开发效率低。要求使用者熟悉 javascript 和 objective -c 两种语言。需要一定的语言功底,在进行 JS 脚本的编写时,由于要把 oc 中对象的属性等原样书写,只能用 OC 的思维编写代码。容易造成拼写错误,没有提示,只能在运行程序时候调试。
2
现阶段还在开发阶段,框架不稳定,功能上存在欠缺,比如 block 的嵌套使用(相信以后会越来越成熟)。
3
在网络不稳定的情况下,有可能不能很好加载脚本,是否会引起未知 bug(待验证,目前测试环境本地加载 JS
)。
测试选项
- view 背景色改变。
changeBackgroundColor:function(sender)
{
var red = Math.floor(Math.random() * ( 255 +0.1))/255;
var green = Math.floor(Math.random() * ( 255 +0.1))/255;
var blue = Math.floor(Math.random() * ( 255 +0.1))/255;
var color = UIColor.colorWithRed_green_blue_alpha(red,green,blue,1)
self.view().setBackgroundColor(color)
}
- 增加控件
addView:function(sender)
{
var aView = require('UIView').alloc().initWithFrame({x:10,y:200,width:50,height:50})
aView.setBackgroundColor(UIColor.redColor())
self.view().addSubview(aView)
}
- 改变 tableveiw 的数据源
tableView_cellForRowAtIndexPath: function(tableView, indexPath)
{
var cell = tableView.dequeueReusableCellWithIdentifier("CELL");
if(!cell){
cell = require('UITableViewCell').alloc().initWithStyle_reuseIdentifier(0,"CELL");
}
// var num = self.dataSource().objectAtIndex(indexPath.row())
// cell.textLabel().setText(num + "js")
var jsArray = self.dataSource().toJS()
cell.textLabel().setText(jsArray[indexPath.row()] + "JS")
return cell;
}
}
- push storyboard 创建的 viewController
tableView_didSelectRowAtIndexPath: function(tableView, indexPath)
{
if(indexPath.section() == 1 && indexPath.row() == 0){
var testVC = self.storyboard().instantiateViewControllerWithIdentifier("testVC");
self.navigationController().pushViewController_animated(testVC,1)
}
if(indexPath.section() == 1 && indexPath.row() == 1){
var tableVC = JSTableViewController.alloc().init()
self.navigationController().pushViewController_animated(tableVC,YES);
}
}
- 执行一段动画
doAnimation:function(sender){
var red = Math.floor(Math.random() * ( 255 +0.1))/255;
var green = Math.floor(Math.random() * ( 255 +0.1))/255;
var blue = Math.floor(Math.random() * ( 255 +0.1))/255;
var color = UIColor.colorWithRed_green_blue_alpha(red,green,blue,1)
UIView.animateWithDuration_animations_completion(1.0,block("",function(){
self.view().setBackgroundColor(color)})
,block("BOOL",function(finished){}));
}
注意
:
此处有个小坑:block()中,第一个参数必须是 string 类型,即使参数为空,也要传入""
进行占位(似乎作者本人应该已经修复了)。
* 第三方框架引入
不需要引入头文件,使用
defineClass()
直接声明即可以使用。
- 生成新类并使用
defineClass('JSTableViewController:UITableViewController',{·······}
JSPatchDemo
个人见解,有不对的地方请指正。