JSPatch來更新已上線的App中出現的BUG(超級詳細)

JSPatch來更新已上線的App中出現的BUG(超級詳細)

字數2858 閱讀422 評論15 

JSPatch的做用是什麼呢?

簡單來講:(後面有具體的操做步驟以及在操做過程當中會出現的錯誤)

1.iOS應用程序上架到AppStore須要等待蘋果公司的審覈,通常審覈時間須要1到2周.雖然程序在上架前會通過測試人員的測試,但有時候仍是難免會發生新版本上線後出現嚴重的bug,致使用戶剛升級到新版本就出現crash,嚴重影響用戶體驗.

2.這時能作的只是趕忙修復bug而後提交等待漫長的AppStore審覈,再盼望用戶快點升級,才能完成這次bug的修復,這樣及容易致使用戶流失,這對企業來講影響很是嚴重.

3.爲了解決因爲AppStore審覈而致使程序更新新版本慢,目前有如下2種方案實時修復線上bug:


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數組


JSPatch優點:

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服務器


JSPatch缺點:

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平臺速度和穩定性如何?

經過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


第二步:登陸http://jspatch.com該網站,這裏須要註冊一下帳號哈(已有帳號的話,能夠直接登陸)

 


下載SDK到本地

 


第三步:下載完成後,打開咱們已經建立好的項目,將下載好的SDK拖到咱們的工程中.

 


第四步:須要在咱們的工程中添加兩個框架( libz.tbd 和 JavaScriptCore.framework )

 

 

 

 


 

第五步:在項目工程裏先建立一個空的文件(main.js),這個就不用說了吧,你們都會哈^_^

注:若是想在空文件中顯示JavaScript的格式的話,能夠進行一下操做:

一、先選中剛纔建立好的(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要和咱們項目中的點擊按鈕執行的方法同樣,若是不同會報錯的



四、在咱們的項目工程中找到AppDelegate.m文件,在如下方法中添加一行測試的代碼,咱們先在本地測試一下,看看是否成功

 

#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


如下爲運行結果  點擊+後出現右對齊的三個

 

第六步:接下來就須要將咱們的main.js文件添加到服務器上來進行操做:

一、將咱們的項目工程中的main.js文件項目中移除,在移除以前要複製一份出來,方便等會將main.js 文件上傳到服務器哈

 


二、登陸到以前登陸的網站,執行如下操做:

2.1  添加咱們要更新的項目名稱:XGJSPatch

 

2.2  點擊新增APP後,出現以下界面,填寫完後,直接點擊"提交"按鈕就能夠了

 

2.3  接下來會看到如下界面:

 

 

2.4  點擊上圖中的」添加APP版本",進入以下界面

 

點擊進入下一個界面

 

 

 

 


第七步:在appDelegate.m文件中寫入下面的代碼:

 

一切準備就緒後,能夠直接運行 可能會出現如下幾個錯誤

ATS:安全機制  在info.plist中加以下代碼


若是都沒有錯誤的話,運行成功後的界面以下圖:

 

下圖是我從新更改了下數據  再從新添加了補丁 運行出來的結果

 

相關文章
相關標籤/搜索