轉 ?: ? ??iOS通過 JSPatch實現 app的熱更新
也許也有很多人覺得這是個很高大上的技術,其實不然,我們只需要在項目里引入極小的引擎文件,就可以使用JavaScript調用任何 Objective-C 的原生接口,替換任意 Objective-C 原生方法。當然呢,目前主要用于下發 JS 腳本替換原生 Objective-C 代碼,實時修復線上 bug。
JSPatch的代碼大家可以去github上面下載,具體的安裝與配置方法,你可以去JSPatch的官網進行學習,網址 :?http://jspatch.com
首先說一下JsPatch實現的內部原理:JsPatch能做到通過JS調用和改寫OC方法最根本的原因是 Objective-C 是動態語言,OC上所有方法的調用/類的生成都通過 Objective-C Runtime 在運行時進行,我們可以通過類名和方法名反射得到相應的類和方法,也可以替換某個類的方法為新的實現,還可以新注冊一個類,為類添加方法。這里就不詳細介紹runtime了,相關的資料我會在后續的博客里介紹,大家再等等吧。所以 JSPatch 的原理就是:JS傳遞字符串給OC,OC通過 Runtime 接口調用和替換OC方法, 重點:那如果APP已經上架后,出現明顯的bug(比如閃退),你只需要到JSPach官網上傳寫好的js文件就可以搞定了 。這個很容易理解,JS的作用只是一個信使的作用,具體實現還是得靠我們OC,所以說OC還是世界上最美的語言,哈哈。
同時在這里給大家一個比較好的網站http://bang590.github.io/JSPatchConvertor/.這是一個OC轉JS的一個工具網站
下面給大家演示一下具體實現的步驟
- (void)viewDidLoad{UITableView* tv = [[UITableViewalloc]initWithFrame:self.view.boundsstyle:UITableViewStylePlain];self.mqTableView= tv;self.mqTableView.delegate=self;self.mqTableView.dataSource=self;? ? [self.viewaddSubview:self.mqTableView];}#pragma mark -- UITableViewDataSource- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{return3;}- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{staticNSString* i=@"cell";UITableViewCell* cell = [tableView? dequeueReusableCellWithIdentifier:i];if(cell ==nil) {? ? ? ? cell =[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:i];? ? }? ? cell.textLabel.text=@"meiqing";? ? cell.backgroundColor= [UIColorwhiteColor];returncell;}- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{self.dataSource= @[@"1",@"2"];// 肯定會超出數組范圍導致 crashNSString*content =self.dataSource[indexPath.row];}
顯示的結果是這樣的
上面的圖片是沒有修改時候的顯示,當我點擊第三行一定會閃退,怎么修復呢?這個時候就不用發版本了,服務器可以給我們傳送一個js文件,文件里的內容是這樣的
同時,我們在APPDelegate里調用這個JS就可以了,如下:
再次運行就不會出現閃退了。
整個流程下來其實挺簡單的,希望大家能夠接受,如果喜歡我的文章,可以關注我后續的文章。