在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]; return YES;}Swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. JSPatch.startWithAppKey("你的Appkey") JSPatch.setupCallback { (type, data, error) in PRint(type) print(data) } JSPatch.setupDevelopment() JSPatch.sync() return true }到這一步項(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ā)版線上干掉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
加密方法:
補(bǔ)充:自己按照文檔和這篇博客集成后測(cè)試崩潰,后來(lái)經(jīng)過(guò)調(diào)試發(fā)現(xiàn)JS代碼寫(xiě)的不正確(自己不會(huì)JS),發(fā)現(xiàn)在JSPatch上有轉(zhuǎn)換和檢測(cè)JS代碼的工具,很方便。推薦使用PSPatch!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注