IOS App經常會遇到這種狀況,線上發現一個嚴重bug
,多是某一個地方Crash
,也多是一個功能沒法使用,這時能作的只有趕忙修復Bug而後提交app store
等待漫長的審覈。
即便申請加急審覈可是審覈速度仍然不會快到那裏去,即便審覈完了以後,還要盼望着用戶快點升級,用戶不升級一樣的漏洞一直存在,這種狀況讓開發者付出了很大的成本才能完成對於Bug
的修復,有可能還須要出現強制升級的狀況。ios
這樣狀況如今有辦法改善,JSPatch
就是爲了解決這樣的問題而出現的,只須要在項目中引入極小的一個JSPatch
引擎,就可使用JavaScript
語言調用Objective-C
的原生API,動態更新App,修復BUG。git
JSPatch
是一個開源的項目,項目網站:http://jspatch.com/,Github地址: https://github.com/bang590/JSPatch
在JSPatch
的官網上面給出了一個例子:github
@implementation JPTableViewController ... - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSString *content = self.dataSource[[indexPath row]]; //可能會超出數組範圍致使crash JPViewController *ctrl = [[JPViewController alloc] initWithContent:content]; [self.navigationController pushViewController:ctrl]; } ... @end
這裏會出現一個數組越界的Crash
能夠經過下發下面的JavaScript代碼修復這個Bug:數組
//JS defineClass("JPTableViewController", { //instance method definitions tableView_didSelectRowAtIndexPath: function(tableView, indexPath) { var row = indexPath.row() if (self.dataSource().length > row) { //加上判斷越界的邏輯 var content = self.dataArr()[row]; var ctrl = JPViewController.alloc().initWithContent(content); self.navigationController().pushViewController(ctrl); } } }, {})
JSPtch
須要一個後臺服務用來下發和管理腳本,並須要處理傳輸安全等JSPatch
平臺提供了對應的服務。安全
在JSPatch
平臺上面註冊一個帳戶,新建一個App就能夠拿到對應的AppKey。服務器
SDK地址:http://jspatch.com/Index/sdk
當前下載下的SDK版本名稱是:JSPatch 2.framework
,須要去掉中間的空格,否則導入項目的時候會報錯。
導入項目的時候要選擇Copy items if needed
。
還須要添加對於的依賴框架JavaScriptCore.framework
和libz.tbd
.app
在AppDelegate.m
中添加代碼:框架
#import "AppDelegate.h" #import <JSPatch/JSPatch.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [JSPatch startWithAppKey:@"f78378d77e5783e8"]; [JSPatch sync]; return YES; } @end
JavaScript
修復文件爲了簡單咱們只上傳一個簡單的UIAlertView
,彈出一個提示框:jsp
ar alertView = require('UIAlertView').alloc().init(); alertView.setTitle('Alert'); alertView.setMessage('AlertView from js'); alertView.addButtonWithTitle('OK'); alertView.show();
這段代碼用JavaScript
實例化了UIAlertView
,文件名須要命名爲main.js
。網站
把main.js
上傳到服務器上,下發到版本爲1.0的客戶端上面。
在請求服務加載腳本的時候出現了一個錯誤:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
這個錯誤出現的緣由是ios9引入了新特性App Transport Security(ATS)
,簡單來講就是App內部的請求必須使用HTTPS協議
。
很明顯這裏的url並無使用https,咱們能夠經過設置先規避掉這個問題:
1. 在info.plist中添加NSAppTransportSecurity類型爲Dictionary. 2. 在NSAppTransportSecurity中添加NSAllowsArbitraryLoads類型爲Boolean,值爲YES
運行效果以下:
這樣就能夠直接修復掉線上bug了,不須要等待App Store
的審覈。