前言
在iOS中有很多種熱修復方案,在這里我就不一一介紹了
這里有一篇介紹熱修復的文章:
iOS中的HotFix方案總結詳解
我選擇的熱修復方案是JSPatch
我覺得JSPatch的優(yōu)點有:
- 非侵入式
- 上手快
- 相關服務成熟
上代碼
大神可以看重點,如果是和我一樣的菜雞就可以按照博客一步一步做,最后一定會成功讓JSPatch跑起來的
第一步:創(chuàng)建Demo,在ViewController里添加一個Label,聲明一個test方法來給Label.text賦值
OC:
Swift:
為了方便label就直接在StoryBoard里拖進來了(不喜歡拖控件的小伙伴可以用代碼創(chuàng)建)
Swift中為每個變量和方法添加dynamic是保證Swift方法都可以被動態(tài)替換,這里涉及到Swift Runtime的知識就不詳細講述了按例貼一篇文章:
Swift Runtime分析:還像OC Runtime一樣嗎?
第二步:打開JSPatch網(wǎng)站下載SDK:http://jspatch.com/Index/sdk
第三步:項目配置(這步稍微會有些復雜)
將解壓后的SDK直接拖入工程中,然后在TARGETS -> Build Phases -> Link Binary With Libraries -> + 添加 libz.dylib(或libz.tbd) 和 JavaScriptCore.framework。
在AppDelegate里寫以下代碼:
- OC
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[JSPatch startWithAppKey:@"你的AppKey"];
//用來檢測回調(diào)的狀態(tài),是更新或者是執(zhí)行腳本之類的,相關信息,會打印在你的控制臺
[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
}
到這一步項目配置就完成了,下一步開始發(fā)補丁到項目中
第四步:打開JSPatch官網(wǎng)點擊左上角注冊 -> http://www.jspatch.com/
注冊或登錄
注冊
第五步:創(chuàng)建你的App,名字可以隨便寫,AppID也可以不填
第六步:點擊添加APP版本,創(chuàng)建一個App版本
介紹一下創(chuàng)建之后的APP:
- appKey是之后在你項目中激活JSPatch要用到的
-
添加App版本 是按照你App的Version來創(chuàng)建的(如果version沒寫對會下載不到補丁)
第七步:創(chuàng)建一個main.js文件并在里面寫上以下代碼:
- OC
defineClass('ViewController', {
test : function() {
self.label().setText("label的text被改掉了");
},
})
- Swift
defineClass('HotFixDemo.ViewController', {
test : function() {
self.label().setText("label的text被改掉了");
},
})
Swift覆蓋方法和類的時候要加上項目名,所以規(guī)范應該是 項目名.類名(方法名) 注冊類的時候也要加上項目名
第八步:點擊剛剛創(chuàng)建的1.0,將保存好的JS上傳到JSPatch服務器上,
選擇文件選擇剛剛創(chuàng)建的main.js (上傳補丁的時候最少要有一個main.js 如果需要上傳多個文件點擊右側加號就可以了)
一定先勾選開發(fā)預覽,這樣才能保證測試成功
一切都操作完之后選擇提交
運行你的項目,如果命令行中顯示以下內(nèi)容就代表你的你的項目已經(jīng)更新補丁了
因為補丁是先下載再生效的,所以下一次運行你才能看到效果
可以看到我的代碼給label賦值為aaaa,通過JSPatch將label.text替換掉了
如果遇到什么問題可以留言給我,我會及時回復并更新博客內(nèi)寫的不足的地方
一些其他的資料:
iOS黑科技之不發(fā)版線上干掉bug(JSPatch)
可能遇到的坑
- JSPatch網(wǎng)站上的版本要一定要和工程里的一樣
- label的名字別寫錯了..我順手就給寫成別的名字了
- Swift一定要在方法和屬性前加dynamic,如果不是繼承自NSObject的Swift類不能被動態(tài)替換
- Swift替換類和方法要比OC在類/方法名之前添加工程名
- 如果項目跑起來控制臺輸出沒有找到文檔就是網(wǎng)站上配置錯了
基本使用姿勢
發(fā)現(xiàn)bug->在項目里修復bug->將修改后的有問題的類和方法翻譯成js并上傳網(wǎng)站->發(fā)布補丁
8月27日補充
JS一定要加密,下面是方法截圖和文檔:
文檔:http://jspatch.com/Docs/rsa
加密方法: