作用
iOS热更新、热修复、热重载、动态创建类、新增方法、扩展新界面。
体验
下载的demo工程,cd到JS目录下,运行运行 npm run build
,这条命令会将刚刚修改的工作区代码(src
)经过转义压缩输出到outputs
目录下, outputs
目录下的文件供app读取使用.
使用
需要一些JS相关的支持,要确保本机已安装npm.如果不知道的同学可以百度安装。 如果已经安装好npm可以往下操作
1.cd /demo/JS
执行 npm install
2.npm run server
关于build说明
- 执行
npm run build
将文件转成各自对应的js. - 执行
npm run package
将src目录下文件打包成一个文件.(demo中使用此种方式进行演示).
热重载
无论动态创建类或原生类都需要继承自Root控制器或者接收通知实现重载方法
JS例子
defineClass('LHBUGController:LHJSRootController', {
viewDidLoad: function () {
Super().viewDidLoad();
},
}, {
});
OC例子
@implementation AppDelegate
- (void)updateResource:(NSString *)filename callbacl:(void(^)(void))callback {
NSURLSession *session = [NSURLSession sharedSession];
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@/%@",
[LHHotRefrshTool shareInstance].getLocaServerIP,
[LHHotRefrshTool shareInstance].getLocaServerPort,
filename]]];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!data || error) {
// 本地代理未开启,加载本地bundle资源,无法实时预览
NSString *srcPath = [[NSBundle mainBundle] pathForResource:@"hotfixPatch" ofType:@"js"];
NSString *jsCode = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:srcPath] encoding:NSUTF8StringEncoding];
[[TTPatch shareInstance] evaluateScript:jsCode withSourceURL:[NSURL URLWithString:@"hotfixPatch.js"]];
return;
}
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (!result || !result.length) {
return ;
}
[[TTPatch shareInstance] evaluateScript:result withSourceURL:[NSURL URLWithString:filename]];
dispatch_async(dispatch_get_main_queue(), ^{
/// 发送热重载通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"LHJSNotificationRefresh" object:nil];
});
if (callback) {
callback();
}
}];
[dataTask resume];
}
#pragma mark - LHHotRefrshTool代理
- (void)reviceRefresh:(id)msg {
[self updateResource:msg callbacl:nil];
}
@end
@implementation LHJSRootController
- (void)viewDidLoad {
[super viewDidLoad];
/// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refresh) name:@"LHJSNotificationRefresh" object:nil];
}
/// 刷新实现
- (void)refresh {
}
@end