热更新JSPatch学习:

热更新的基础理论和需求原因就不介绍了,不清楚的可以百度,APP线上修复bug类似于游戏的补丁修复,这里给出几个可行的技术方案并比较其优缺点


一:实现热更新的几种思路:


1,原生动态化
在保持原生语言开发的基础上加入动态补丁修复,保证APP性能和效果的同时完成bug修复和模块添加,目前使用较多的有两种方式,一是广泛应用的JSPatch,该方案可以实时修复线上bug,安全快速,官网sdk使用RSA签名加密,本地存储加密保证脚本安全,需要接sdk。二是私有方案,目前滴滴和手Q等自研的dynamicCocoa可以实现热更新,功能强大,不过未开源


2.优化web性能入手
weex是阿里前端技术团队开源的项目,用于APP上可以实现web方式开发,原生方式渲染,拥有web开发和发布的优势,又有不错的性能体验,缺点是接入成本高,学习成本和维护成本高,团队学习成本比较高。二是React-Native,RN技术近来火热。可以单独开发APP,为APP动态添加模块,有自己的IDE支持,开发效率高,目前能替代就是本来采用H5开发的模块,不是原生语言开发,流畅度和视觉效果可能差一点


3.动态库(已经被苹果屏蔽)
waxPatch,可以用lua调用OC方法,但是苹果有规定iOS Developer Program License Agreement里3.3.2提到不可动态下发可执行代码,而waxPatch属于这种,并且开发团队已经停止开发维护,不支持OC里的block和lua程序互传


综上所述,集合目前主流开发语言和趋势,可以使用原生动态化方案里的JSPatch方案,和优化web性能的RN方案。我没学过RN 所以只分析JSPatch


使用方法是bang神开发的JSPatch,这里附上链接:http://blog.cnbang.net/works/2767/


主要使用JS的API:defineClass(classDeclaration,[property,], instanceMethods, classMethod), 其中,第一个参数classDeclaration:字符串,类名/父类名和protocol,第二个参数,新增的属性property,字符串数组(可省略),第三个参数,instanceMethods:要添加或覆盖的实例方法,第四个参数classMethods:要添加或覆盖的类方法


覆盖方法
1.在define class里定义已存在的方法即可覆盖,方法名规则与调用规则一样,使用_分隔
比如在项目内有一个方法出错,需要线上修复
@implementation  FoundVIewController内
- (void) tableview:(uitableview *)tableview didselectRowAtIndexPath:(nsindexPath *)indexPath{
@throw [NSException exceptionWithName:@“点击就出错了”  reson:@“就不让你瞎点,点了就崩” userinfo:nil];
}

@end
在上述代码中,tabbar的发现部分是一个表格,点击所有的表格都会造成崩溃,是一个bug,那么如何修复呢?可以使用方法覆盖
defineClass(“FoundViewController”, {
tableview_didselectRowAtIndexpath: function(tableview,indexPath) {
consoleLog(“替换了这个就不让你怎么点都不会崩溃”);
}
});
如果OC方法名中有下划线,那么在js使用的时候就要用双下划线来替代
// OC
@implementation JPTableViewController
- (NSArray *) _dataSource {
}
@end
// JS
defineClass("JPTableViewController", {
  __dataSource: function() {
  },
})
现在有这样一种情况:
如果一个bug其实是后台的原因造成,但是他们修复起来有一定的开发量和时间,那么我帮他们上了一个js来热更新一下暂时改我的代码逻辑,当后台完成修复后  我需要让我的新加的js方法失效,还用成原来的方法,该怎么做呢?
在我热更新的js文件添加如下逻辑就可以了。正常使用时还需要添加一个条件判断等

// OC
@implementation JPTableViewController
- (void)viewDidLoad {
}
@end
// JS
defineClass("JPTableViewController", {
  viewDidLoad: function() {
     self.ORIGviewDidLoad();
  },
})
现在有这样一种情况,后台给我返回字符串类型的数据,我定义的字符串的属性修饰符没有用copy,而是用了strong,结果使用的时候发现数据不对,我要修改这么一个属性修饰符。
// OC
@interface JPTableViewController
@property (nonatomic) NSArray *data;
@property (nonatomic) NSString *shareURL;
@property (nonatomic) NSString *shareTitle;
@end
@implementation JPTableViewController
@end
// JS
defineClass("JPTableViewController", {
  viewDidLoad: function() {
     var data = self.data();     //get property value
     self.setData(data.toJS().push("JSPatch"));     //set property value
     var sel = self;
     self.bridge().registerHandler_handler('h5ToNativeShareDialog', block('NSDictionary *',function(data,responseCallback) {         
         sel.setShareURL(data.objectForKey('url'));
         sel.setShareTitle(data.objectForKey('title'));
     }));
})
动态新增property
可以在 defineClass() 第二个参数为类新增 property,格式为字符串数组,使用时与 OC property 接口一致:
defineClass("JPTableViewController", ['data', 'totalCount'], {
  init: function() {
     self = self.super().init()
     self.setData(["a", "b"])     //添加新的 Property (id data)
     self.setTotalCount(2)
     return self
  },
  viewDidLoad: function() {
     var data = self.data()     //获取 Property 值
     var totalCount = self.totalCount()
  },
})

现在有这样的一个简单的需求,代码里的方法没有错,只是由于之前没想好,少了一些逻辑和对数据的处理,重新发版又犯不上,那怎么办呢?可以利用JSPatch来为类中任意添加方法的功能来实现这个需求。
示例方法:
// OC
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
// 巴拉巴拉你自己的逻辑
}


现在要在里面加一些各种逻辑判断数据处理,放在一个方法里,名字叫做addNewMethod,然后把这个方法放在每次点击的时候触发。那么我在js中可以这么写
// JS
defineClass("FoundViewContrller",
tableview_didselectRowAtIndexPath: function(tableview, indexpath){
// 巴拉巴拉你自己的逻辑
self.addNewMethod();// 指你要添加的方法名字,在oc中的didSelectRowAtIndexPath方法要调用
addNewMethod: function(){// 方法内部
// 新添加的逻辑和处理。
}
}
)
这样就可以了。



一:
有C的语法部分,如NSLog
NSLog  使用console.log("呵呵呵 全给替代了”);这种
有block部分,有gcd的部分,具体可以查看上面我附的连接,查看原作者的文档介绍可以看的更详细。大多数时候我们热修复只是针对一定的bug修复,如果要是添加模块增加功能,还是建议上版本



本人创建了一个公众号,里面每天发一些教程进阶知识,有的是本人总结所得,有的是转载大神的文章,大家一起分享看。扫码关注公众号:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值