使用JSPatch平臺(tái)熱修復(fù)iOS App

IOS產(chǎn)品開發(fā)中常常會(huì)遇到這種情況,線上發(fā)現(xiàn)一個(gè)嚴(yán)重bug,可能是一個(gè)crash,可能是一個(gè)功能無法使用坯门,這時(shí)能做的只是趕緊修復(fù)Bug然后提交等待漫長(zhǎng)的審核坡氯,即使申請(qǐng)加急也不會(huì)快到那里去,即使審核完了之后脉漏,還要盼望著用戶快點(diǎn)升級(jí)五嫂,用戶不升級(jí)還是在存在同樣的漏洞颗品,這樣的情況讓開發(fā)者付出了很大的成本才能完成Bug的修復(fù)。

JSPath就是為了解決這樣的問題而出現(xiàn)的沃缘,只需要在項(xiàng)目中引入極小的JSPatch引擎躯枢,就可以還用JavaScript語言調(diào)用Objective-C的原生API,動(dòng)態(tài)更新APP槐臀,修復(fù)BUG锄蹂。

JSPaht本身是開源項(xiàng)目github傳送門
在他的官網(wǎng)上面給出了一個(gè)例子:

@implementation JPTableViewController
...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *content = self.dataSource[[indexPath row]];  //可能會(huì)超出數(shù)組范圍導(dǎo)致crash
  JPViewController *ctrl = [[JPViewController alloc] initWithContent:content];
  [self.navigationController pushViewController:ctrl];
}
...
@end

可以通過下發(fā)下面的JavaScript代碼修復(fù)這個(gè)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需要一個(gè)后臺(tái)服務(wù)用來下發(fā)和管理腳本,并需要處理傳輸安全等水慨。

  • 注冊(cè)獲取AppKey

在平臺(tái)上面注冊(cè)一個(gè)賬戶得糜,新建一個(gè)App可以拿到對(duì)應(yīng)的AppKey。

  • 導(dǎo)入SDK到項(xiàng)目中
    SDK地址

當(dāng)前下載下來的SDK版本名稱是:JSPatch 2.framework,需要去掉中間的空格晰洒,不然導(dǎo)入項(xiàng)目的時(shí)候會(huì)報(bào)錯(cuò)朝抖。
導(dǎo)入項(xiàng)目的時(shí)候要選擇Copy items if needed。
還需要添加對(duì)于的依賴框架JavaScriptCore.framework和libz.tbd.

  • 添加JSPatch代碼
    在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

在平臺(tái)中上傳js修復(fù)文件
為了簡(jiǎn)單我們只上傳一個(gè)簡(jiǎn)單的UIAlertView,彈出一個(gè)提示框:

ar alertView = require('UIAlertView').alloc().init();
alertView.setTitle('Alert');
alertView.setMessage('AlertView from js');
alertView.addButtonWithTitle('OK');
alertView.show();

用JavaScript實(shí)例化了UIAlertView欢顷,文件名需要命名為main.js槽棍。

從服務(wù)器下發(fā)到客戶端
把main.js上傳到服務(wù)器上,下發(fā)到版本為1.0的客戶端上面抬驴。
在請(qǐng)求服務(wù)加載腳本的時(shí)候出現(xiàn)了一個(gè)錯(cuò)誤:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
這個(gè)錯(cuò)誤出現(xiàn)的原因是ios9引入了新特性App Transport Security(ATS),簡(jiǎn)單來說就是APP內(nèi)部的請(qǐng)求必須使用HTTPS協(xié)議炼七。
很明顯這里的url并沒有使用https,我們可以通過設(shè)置先規(guī)避掉這個(gè)問題:

1.在info.plist中添加NSAppTransportSecurity類型為Dictionary. 2.在NSAppTransportSecurity中添加NSAllowsArbitraryLoads類型為Boolean布持,值為YES

845657877-570c9e0d7ddf5_articlex.png

運(yùn)行效果:

2605371613-570c9f3c39f76_articlex.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豌拙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子题暖,更是在濱河造成了極大的恐慌按傅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胧卤,死亡現(xiàn)場(chǎng)離奇詭異唯绍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枝誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門况芒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叶撒,你說我怎么就攤上這事绝骚。” “怎么了祠够?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵压汪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我古瓤,道長(zhǎng)止剖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任落君,我火速辦了婚禮滴须,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叽奥。我一直安慰自己扔水,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布朝氓。 她就那樣靜靜地躺著魔市,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赵哲。 梳的紋絲不亂的頭發(fā)上待德,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音枫夺,去河邊找鬼将宪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的较坛。 我是一名探鬼主播印蔗,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丑勤!你這毒婦竟也來了华嘹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤法竞,失蹤者是張志新(化名)和其女友劉穎耙厚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岔霸,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薛躬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呆细。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片型宝。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侦鹏,靈堂內(nèi)的尸體忽然破棺而出诡曙,到底是詐尸還是另有隱情,我是刑警寧澤略水,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布价卤,位于F島的核電站,受9級(jí)特大地震影響渊涝,放射性物質(zhì)發(fā)生泄漏慎璧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一跨释、第九天 我趴在偏房一處隱蔽的房頂上張望胸私。 院中可真熱鬧,春花似錦鳖谈、人聲如沸岁疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捷绒。三九已至,卻和暖如春贯要,著一層夾襖步出監(jiān)牢的瞬間暖侨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工崇渗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留字逗,地道東北人京郑。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像葫掉,于是被迫代替她去往敵國(guó)和親些举。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一挖息、目的: 隨著APP迭代更新金拒,項(xiàng)目越寫越龐大兽肤,每個(gè)功能間的關(guān)聯(lián)性越來越多套腹。再加上測(cè)試人員人手不足等情況,不可避免...
    LQWAWAIOS閱讀 446評(píng)論 0 2
  • IOS App常常會(huì)遇到這種情況资铡,線上發(fā)現(xiàn)一個(gè)嚴(yán)重bug,可能是某一個(gè)地方Crash,也可能是一個(gè)功能無法使用电禀,這...
    姜家志閱讀 1,299評(píng)論 3 35
  • 17/03/08更新有不少小伙伴反應(yīng)蘋果發(fā)送了郵件要求去除項(xiàng)目中用于動(dòng)態(tài)改變應(yīng)用的代碼 ,看來 JSPatch 要...
    dy_zhang閱讀 3,402評(píng)論 5 15
  • IOS產(chǎn)品開發(fā)中常常會(huì)遇到這種情況笤休,線上發(fā)現(xiàn)一個(gè)嚴(yán)重bug,可能是一個(gè)crash,可能是一個(gè)功能無法使用尖飞,這時(shí)能做...
    Leopx閱讀 280評(píng)論 0 0
  • JSPatch 是騰訊微信團(tuán)隊(duì)牛人bang開源的一種通過JavaScript調(diào)用iOS原生代碼來實(shí)現(xiàn)熱修復(fù)或者動(dòng)態(tài)...
    杭研融合通信iOS閱讀 863評(píng)論 2 23