1⃣️直接使用UIWebView加載網絡上的HTML的代碼,這樣若是有問題只須要更新服務器的HTML文件,用戶從新進入程序,加載新的HTML文件,整個程序就能更新.對用戶影響很是小前端
2⃣️使用其餘腳本語言經過Runtime動態調用OCweb
1⃣️.1⃣️WaxPatch:它把Lua腳本語言和原生Objective-C應用編程接口(API)結合起來,經過Lua腳原本調用OC編程
1⃣️.2⃣️JSPatch:JS是經過JavaScriptCore.framework調用Runtime,來實現JS調用OC數組
1⃣️JS比Lua在應用開發領域有更普遍的應用,目前前端開發和前端開發有融合的趨勢,做爲擴展的腳本語言,JS是不二之選瀏覽器
2⃣️JSPatch更符合Apple的規則。iOS Developer Program License Agreement裏3.3.2提到不可動態下發可執行代碼,但經過蘋果JavaScriptCore.framework或WebKit執行的代碼除外,JS正是經過JavaScriptCore.framework執行的七牛雲存儲
3⃣️使用系統內置的JavaScriptCore.framework,無需內嵌腳本引擎,體積小巧安全
4⃣️支持block服務器
1⃣️相對於WaxPatch,JSPatch劣勢在於不支持iOS6,由於須要引入JavaScriptCore.framework網絡
2⃣️另外目前內存的使用上會高於wax,持續改進中併發
存在風險:JSPatch讓腳本語言得到調用全部原生OC方法的能力,不像web前端把能力侷限在瀏覽器,使用上會有一些安全風險
1⃣️若在網絡傳輸過程當中下發明文JS,可能會被中間人篡改JS腳本,執行任意方法,盜取APP裏的相關信息,危及用戶信息和APP
2⃣️若下載完後的JS保存在本地沒有加密,在越獄的機器上用戶也能夠手動替換或篡改腳本
1⃣️JSPatch腳本的執行權限很高,若在傳輸過程當中被中間人篡改,會帶來很大的安全問題,爲了防止這種狀況出現,在傳輸過程當中對JS文件進行了RSA簽名加密,流程以下:
服務端:計算JS文件MD5值。用RSA私鑰對MD5值進行加密,與JS文件一塊兒下發給客戶端。
客戶端:拿到加密數據,用RSA公鑰解密出MD5值。本地計算返回的JS文件MD5值。對比上述的兩個MD5值,若相等則校驗經過,取JS文件保存到本地。
因爲RSA是非對稱加密,在沒有私鑰的狀況下第三方沒法加密對應的MD5值,也就沒法僞造JS文件,杜絕了JS文件在傳輸過程被篡改的可能。
2⃣️本地存儲
本地存儲的腳本被篡改的機會小不少,只在越獄機器上有點風險,對此JSPatch SDK在下載完腳本保存到本地時也進行了簡單的對稱加密,每次讀取時解密。
JSPatch須要使用者有一個後臺能夠下發和管理腳本,而且須要處理傳輸安全等部署工做,JSPatch平臺幫你作了這些事,提供了腳本後臺託管,版本管理,保證傳輸安全等功能,讓你無需搭建一個後臺,無需關心部署操做,只需引入一個SDK便可當即使用JSPatch。
經過JSPatch平臺上傳的腳本文件都會保存在七牛雲存儲上,客戶端APP只跟七牛服務器通信,支持高併發,CDN分佈全國,速度和穩定性有保證。
除了修復bug,JSPatch也能夠用於動態運營,實時修改線上APP行爲,或動態添加功能。
JSPatch詳細使用文檔見Github Wiki
#import"ViewController.h"
@interfaceViewController()
@property(nonatomic,weak)UITableView*table;
//建立可變數組來更新數據
@property(nonatomic,strong)NSMutableArray*dataArray;
@end
@implementationViewController
#pragma mark -懶加載可變數組
- (NSMutableArray*)dataArray
{
if(_dataArray==nil)
{
_dataArray= [NSMutableArrayarray];
[_dataArrayaddObjectsFromArray:@[@"huangfang--1",@"huangfang--2",@"huangfang--3",@"huangfang--4",@"huangfang--5"]];
}
return_dataArray;
}
- (void)viewDidLoad
{
[superviewDidLoad];
self.view.backgroundColor= [UIColorgrayColor];
[selfsetUpVCWithContent];
}
#pragma mark -設置控制器的內容
-(void)setUpVCWithContent
{
//自定義導航欄的標題控件
UILabel*label = [[UILabelalloc]initWithFrame:CGRectMake(0,0,100,44)];
label.text=@"HFJSpatch";
label.textColor= [UIColorgreenColor];
label.font= [UIFontboldSystemFontOfSize:30];
self.navigationItem.titleView= label;
//自定義導航欄右邊的item
UIButton*button =[UIButtonbuttonWithType:UIButtonTypeContactAdd];
[buttonaddTarget:selfaction:@selector(addData)forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem*rightButton = [[UIBarButtonItemalloc]initWithCustomView:button];
self.navigationItem.rightBarButtonItem= rightButton;
UITableView*table = [[UITableViewalloc]initWithFrame:self.view.bounds];
self.table= table;
table.dataSource=self;
[self.viewaddSubview:table];
}
#pragma mark -添加數據的方法
-(void)addData
{
NSString*datas =nil;
[self.dataArrayaddObject:datas];
[self.tablereloadData];
}
#pragma mark -數據源方法
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
returnself.dataArray.count;
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
staticNSString*ID =@"HFcell";
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];
if(cell ==nil)
{
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:ID];
cell.textLabel.textColor= [UIColorredColor];
cell.textLabel.textAlignment=NSTextAlignmentCenter;
cell.textLabel.font= [UIFontsystemFontOfSize:20];
if(indexPath.row>5)
{
cell.textLabel.textColor= [UIColororangeColor];
cell.textLabel.textAlignment=NSTextAlignmentRight;
cell.textLabel.font= [UIFontboldSystemFontOfSize:25];
}
}
cell.textLabel.text=self.dataArray[indexPath.row];
returncell;
}
@end
一、先選中剛纔建立好的(main.js)
2.
3.在文件中寫入代碼
//main.js
// 指定要更新的對應的控制器
defineClass("ViewController", {
// 添加或修改的方法(
addData: function() {
// 獲取到控制器中的可變數組
var datas = self.dataArray();
datas.addObject("huangfang6");
datas.addObject("huangfang7");
datas.addObject("huangfang8");
datas.addObject("huangfang9");
// 若是添加成功會將數組中的第一個元素打印出來(這個能夠根據須要進行打印)
// console.log(datas.firstObject());
// 若是添加成功會將數組中的第一個元素打印出來
console.log(datas.lastObject());
self.table().reloadData();
}
})
注:上面的 addData: function() 中的addData要和咱們項目中的點擊按鈕執行的方法同樣,若是不同會報錯的
#import 「AppDelegate.h"
#import 「ViewController.h"
#import<JSPatch/JSPatch.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
ViewController *vc = [[ViewController alloc]init];
vc.view.backgroundColor = [UIColor magentaColor];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = nav;
[self.window makeKeyWindow];
[JSPatch testScriptInBundle];
return YES;
}
@end
如下爲運行結果 點擊+後出現右對齊的三個
點擊進入下一個界面
ATS:安全機制 在info.plist中加以下代碼