參考來自:http://www.lxweimin.com/p/8cec322531ae
JSPatch,也許也有很多人覺得這是個很高大上的技術,其實不然,我們只需要在項目里引入極小的引擎文件,就可以使用 JavaScript 調用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法。當然呢,目前主要用于下發 JS 腳本替換原生 Objective-C 代碼,實時修復線上 bug。
JSPatch的代碼大家可以去github 上面下載
首先說一下JsPatch實現的內部原理:JsPatch能做到通過JS調用和改寫OC方法最根本的原因是 Objective-C 是動態語言,OC上所有方法的調用/類的生成都通過 Objective-C Runtime 在運行時進行,我們可以通過類名和方法名反射得到相應的類和方法,也可以替換某個類的方法為新的實現,還可以新注冊一個類,為類添加方法。這里就不詳細介紹runtime了,相關的資料我會在后續的博客里介紹,大家再等等吧。所以 JSPatch 的原理就是:JS傳遞字符串給OC,OC通過 Runtime 接口調用和替換OC方法。這個很容易理解,JS的作用只是一個信使的作用,具體實現還是得靠我們OC,所以說OC還是世界上最美的語言,哈哈。
同時在這里給大家一個比較好的網站 點這里.這是一個OC轉JS的一個工具網站。
下面給大家演示一下具體實現的步驟
- (void)viewDidLoad
{
UITableView* tv = [[UITableView alloc]initWithFrame:self.view.bounds
style:UITableViewStylePlain];
self.mqTableView = tv;
self.mqTableView.delegate = self;
self.mqTableView.dataSource = self;
[self.view addSubview:self.mqTableView];
}
#pragma mark -- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* i= @"cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:i];
if (cell == nil ) {
cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:i];
}
cell.textLabel.text = @"meiqing";
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.dataSource = @[@"1",@"2"];
// 肯定會超出數組范圍導致 crash
NSString *content = self.dataSource[indexPath.row];
}
顯示的結果是這樣的
屏幕快照 2015-12-10 上午12.09.15.png
上面的圖片是沒有修改時候的顯示,當我點擊第三行一定會閃退,怎么修復呢?這個時候就不用發版本了,服務器可以給我們傳送一個js文件,文件里的內容是這樣的
屏幕快照 2015-12-10 上午12.44.14.png
同時,我們在APPDelegate里調用這個JS就可以了,如下:
屏幕快照 2015-12-10 上午12.45.25.png
再次運行就不會出現閃退了。整個流程下來其實挺簡單的,希望大家能夠接受,如果喜歡我的文章,可以關注我后續的文章。
附帶github demo