標籤:
一.熱補丁作用:修複導致崩潰的錯誤、替換/增加方法、替換原來的介面等等
二.實現手段:JSPatch (使用Objective-C Objective-C和JavaScript jspatch橋。你可以調用任何Objective-C類和方法在JavaScript中的只是其中一小發動機。這使應用程式擷取指令碼語言的力量:添加模組或更換Objective-C代碼來修複漏洞動態)。傳送門:https://github.com/agelessman/JSPatch
三.Demo:
- JSPatch匯入:拷貝
JSEngine.m 、JSEngine.h 、JSPatch.js到工程。添加依賴庫 JavaScriptCore.framework
- 實現部分:
- APPDelegate中的實現策略如下:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 3 /** 這裡熱更新的實現思路:info.plist記錄一個當前的版本號碼,每次程式開啟的時候都去後台擷取當前最新的版本號碼。拿這個最新版本號碼與本地的版本號碼比對,如果匹配成功---->不進行任何操作;如果匹配失敗---->下載js檔案進行熱更新 */ 4 5 //1.開啟JP引擎 6 [JPEngine startEngine]; 7 8 //2.js檔案路徑 9 NSString * jsPath = [[NSBundle mainBundle] pathForResource:JSName10 ofType:@"js"];11 12 //3.設定編碼格式13 NSString * script = [NSString stringWithContentsOfFile:jsPath14 encoding:NSUTF8StringEncoding15 error:nil];16 17 //4.熱更新18 [JPEngine evaluateScript:script];19 20 self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];21 22 [self.window addSubview:[self genView]];23 24 self.window.rootViewController = [[ViewController alloc]init];25 26 [self.window makeKeyAndVisible];27 28 return YES;29 }
1 /** 建立一個View到當頁面,我們的目標利用js檔案來動態修改這個方法 */2 -(UIView *)genView3 {4 UIView * newView = [[UIView alloc]initWithFrame:CGRectMake(0, 0,KDeviceWidth,KDeviceHeight)];5 newView.backgroundColor = [UIColor grayColor];6 return newView;7 }
- 編寫JS檔案:
1 // demo.js 2 require(‘UIView, UIColor, UILabel‘) 3 defineClass(‘AppDelegate‘, { 4 // 替換這個 -genView 方法 5 genView: function() { 6 var view = self.ORIGgenView(); 7 view.setBackgroundColor(UIColor.greenColor()) //修改背景色 8 var label = UILabel.alloc().initWithFrame(view.frame()); //建立一個label 9 label.setText("JSPatch");10 label.setTextAlignment(1);11 view.addSubview(label);12 return view;13 }14 });
四.實現原理:
- 基礎原理:能做到通過 JS 調用和改寫 OC 方法最根本的原因是 Objective-C 是動態語言,OC 上所有方法的調用 / 類的產生都通過 Objective-C Runtime 在運行時進行,我們可以通過類名 / 方法名反射得到相應的類和方法(runtime入門教程傳送門:http://blog.csdn.net/lizhongfu2013/article/details/9496705 )p.s:runtime是Objective-C的重要部分,如果想進階中高階iOS程式猿runtime理論必須要掌握。會與不會真的兩個境界!!
- 底層原理:傳送門:http://blog.cnbang.net/tech/2808/ p.s:建議大概瞭解下runtime介面再仔細閱讀這篇部落格,真心贊
五.弊端:
- JS檔案是在網路上傳遞需要考慮安全性。如果在傳輸過程中被別人截獲並篡改的話,這對APP的安全性以及保密性的傷害可想而知。
- 解決方式:加密、Https讓js檔案以密文或者更安全的鏈路傳遞
- JS檔案一般偷摸下載之後會儲存到本地檔案。如果使用者越獄之後可以用一個叫filelBox(大概是一個)的軟體可以讀寫沙箱中的檔案。從而影響APP的穩定性
- 解決方式:本地下載之後儲存也需要加密,不要明文的形式展示
iOS開發那些事兒(一)熱補丁