JSPatch 热更新框架的个人评估

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
个人见解,有不对的地方请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值