JSPatch是bang大神的,最近有项目需要热更新,由于项目已经开发好了,只是担心在上线过程中有潜在的问题,用热更新可以将潜在的bug在用户打开APP的时候更新掉,于是开始学习中 ~~~
JSPatch的官方文档
1、接入,平台建议cocoapods集成
platform:ios,'7.0'
target "JsPatchDemo" do
pod 'JSPatchPlatform'
pod 'JSPatch'
pod 'JSPatch/Extensions'
pod 'JSPatch/JPCFunction'
end
2、使用
在main.js中,先找到我们oc中的方法,然后用js的方式改写、添加、覆盖我们oc的方法,若是一个方法体很长,可以把我们oc的代码拷贝在平台的转换工具中,可自动转为相对应的js的方法,再拷贝到main.js中。
3、demo
1)、给按钮添加事件
defineClass(classDeclaration, [properties,] instanceMethods, classMethods)
@param classDeclaration: 字符串,类名/父类名和Protocol
@param properties: 新增property,字符串数组,可省略
@param instanceMethods: 要添加或覆盖的实例方法
@param classMethods: 要添加或覆盖的类方法
defineClass('ViewController',{
onClick: function() {//添加按钮事件
console.log('onclick .....')
},{}
})
2)、修改已经实现的方法
defineClass('ViewController',{
tableView_didSelectRowAtIndexPath: function(tableView,indexPath) {//复写tableview的点击cell方法
console.log('Yuna')
},{}
})
3)、给属性赋值
//oc中定义data,但是没有初始化和赋值,在main.js中给这个data赋值,并可以使用
@property (nonatomic) NSArray *data;
//重写viewdidload方法
defineClass('ViewController',{
viewDidLoad: function() {
self.createTable();//调用原来的方法,创建列表
//获取/修改 OC 定义的 Propert
var data = self.data();
var da = [];
for (var i = 0; i < 20; i ++) {
da.push("js " + i);
}
self.setData(da);
console.log(da);//打印出来
self.reFreah();//刷新tableview
}
})
4)、私有成员变量
使用 valueForKey() 和 setValue_forKey() 获取/修改私有成员变量
//OC声明的,但是没有初始化和赋值
@interface ViewController (){
NSArray *dicArray;
}
//main.js中
defineClass('ViewController',{
onClick: function() {//添加按钮事件
console.log('onclick .....')
},
tableView_didSelectRowAtIndexPath: function(tableView,indexPath) {//复写tableview的点击cell方法
console.log('Yuna')
},
viewDidLoad: function() {
var dicArray = self.valueForKey("dicArray") //get member variables
self.setValue_forKey(["JSPatch"], "dicArray")
self.reFreah();
//在OC的这个方法中可以打印出dicArray的值
}
})
打开我们的项目工程,我们测试下我们的js,是否可以更新掉,我们可以讲main.js 托人项目中,然后在
#import <JSPatchPlatform/JSPatch.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JSPatch testScriptInBundle];
}
运行模拟器,就可以直接运行我们在js中写的代码了,热更新成功了。注意