swift中級(jí)-- 熱更新- JSPatch

本文為轉(zhuǎn)載文章 . 版權(quán)歸原文所有。

原文鏈接:iOS 5分鐘集成熱修復(fù)(JSPatch)

前言

在iOS中有很多種熱修復(fù)方案,在這里我就不一一介紹了

這里有一篇介紹熱修復(fù)的文章:

iOS中的HotFix方案總結(jié)詳解

我選擇的熱修復(fù)方案是JSPatch

我覺(jué)得JSPatch的優(yōu)點(diǎn)有:

非侵入式

上手快

相關(guān)服務(wù)成熟

上代碼

大神可以看重點(diǎn),如果是和我一樣的菜雞就可以按照博客一步一步做,最后一定會(huì)成功讓JSPatch跑起來(lái)的

第一步:創(chuàng)建Demo,在ViewController里添加一個(gè)Label,聲明一個(gè)test方法來(lái)給Label.text賦值

OC:

Swift:

為了方便label就直接在StoryBoard里拖進(jìn)來(lái)了(不喜歡拖控件的小伙伴可以用代碼創(chuàng)建)

Swift中為每個(gè)變量和方法添加dynamic是保證Swift方法都可以被動(dòng)態(tài)替換,這里涉及到Swift Runtime的知識(shí)就不詳細(xì)講述了按例貼一篇文章:

Swift Runtime分析:還像OC Runtime一樣嗎?

第二步:打開(kāi)JSPatch網(wǎng)站下載SDK:http://jspatch.com/Index/sdk

第三步:項(xiàng)目配置(這步稍微會(huì)有些復(fù)雜)

將解壓后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。

在AppDelegate里寫(xiě)以下代碼:

OC

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// Override point for customization after application launch.[JSPatch startWithAppKey:@"你的AppKey"];//用來(lái)檢測(cè)回調(diào)的狀態(tài),是更新或者是執(zhí)行腳本之類(lèi)的,相關(guān)信息,會(huì)打印在你的控制臺(tái)[JSPatch setupCallback:^(JPCallbackType type,NSDictionary*data,NSError*error) {? }];? [JSPatch setupDevelopment];? [JSPatch sync];returnYES;}

Swift

funcapplication(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)->Bool{// Override point for customization after application launch.JSPatch.startWithAppKey("你的Appkey")JSPatch.setupCallback { (type, data, error)inprint(type)print(data)? ? ? }JSPatch.setupDevelopment()JSPatch.sync()returntrue}

到這一步項(xiàng)目配置就完成了,下一步開(kāi)始發(fā)補(bǔ)丁到項(xiàng)目中

第四步:打開(kāi)JSPatch官網(wǎng)點(diǎn)擊左上角注冊(cè) ->http://www.jspatch.com/

注冊(cè)或登錄

注冊(cè)

第五步:創(chuàng)建你的App,名字可以隨便寫(xiě),AppID也可以不填

第六步:點(diǎn)擊添加APP版本,創(chuàng)建一個(gè)App版本

介紹一下創(chuàng)建之后的APP:

appKey是之后在你項(xiàng)目中激活JSPatch要用到的

添加App版本 是按照你App的Version來(lái)創(chuàng)建的(如果version沒(méi)寫(xiě)對(duì)會(huì)下載不到補(bǔ)丁)

第七步:創(chuàng)建一個(gè)main.js文件并在里面寫(xiě)上以下代碼:

OC

defineClass('ViewController', {? ? ? ? ? test :function(){self.label().setText("label的text被改掉了");

? ? ? ? ? },

})

Swift

defineClass('HotFixDemo.ViewController', {? ? ? ? ? test :function(){self.label().setText("label的text被改掉了");

? ? ? ? ? },

})

Swift覆蓋方法和類(lèi)的時(shí)候要加上項(xiàng)目名,所以規(guī)范應(yīng)該是 項(xiàng)目名.類(lèi)名(方法名) 注冊(cè)類(lèi)的時(shí)候也要加上項(xiàng)目名

第八步:點(diǎn)擊剛剛創(chuàng)建的1.0,將保存好的JS上傳到JSPatch服務(wù)器上,

選擇文件選擇剛剛創(chuàng)建的main.js (上傳補(bǔ)丁的時(shí)候最少要有一個(gè)main.js 如果需要上傳多個(gè)文件點(diǎn)擊右側(cè)加號(hào)就可以了)

一定先勾選開(kāi)發(fā)預(yù)覽,這樣才能保證測(cè)試成功

一切都操作完之后選擇提交

運(yùn)行你的項(xiàng)目,如果命令行中顯示以下內(nèi)容就代表你的你的項(xiàng)目已經(jīng)更新補(bǔ)丁了

因?yàn)檠a(bǔ)丁是先下載再生效的,所以下一次運(yùn)行你才能看到效果

可以看到我的代碼給label賦值為aaaa,通過(guò)JSPatch將label.text替換掉了

如果遇到什么問(wèn)題可以留言給我,我會(huì)及時(shí)回復(fù)并更新博客內(nèi)寫(xiě)的不足的地方

一些其他的資料:

JSPatch文檔

iOS黑科技之不發(fā)版線(xiàn)上干掉bug(JSPatch)

Objective-C代碼轉(zhuǎn)換成JavaScript

可能遇到的坑

JSPatch網(wǎng)站上的版本要一定要和工程里的一樣

label的名字別寫(xiě)錯(cuò)了..我順手就給寫(xiě)成別的名字了

Swift一定要在方法和屬性前加dynamic,如果不是繼承自NSObject的Swift類(lèi)不能被動(dòng)態(tài)替換

Swift替換類(lèi)和方法要比OC在類(lèi)/方法名之前添加工程名

如果項(xiàng)目跑起來(lái)控制臺(tái)輸出沒(méi)有找到文檔就是網(wǎng)站上配置錯(cuò)了

基本使用姿勢(shì)

發(fā)現(xiàn)bug->在項(xiàng)目里修復(fù)bug->將修改后的有問(wèn)題的類(lèi)和方法翻譯成js并上傳網(wǎng)站->發(fā)布補(bǔ)丁

8月27日補(bǔ)充

JS一定要加密,下面是方法截圖和文檔:

文檔:http://jspatch.com/Docs/rsa

加密方法:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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