前言
掘金3.5.2上線後發現了一個bug,我司iOS小哥上線前不小心改動了一部分程式碼,導致髒資料被快取,取快取的時候會導致專案崩潰...(蘋果的稽核越來越不認真了....好吧,我不推鍋了,讓我跪著寫完這篇部落格)..
迴歸正題:
在iOS中有很多種熱修復方案,在這裡我就不一一介紹了
這裡有一篇掘金裡介紹熱修復的文章: iOS中的HotFix方案總結詳解
我選擇的熱修復方案是JSPatch 我覺得JSPatch的優點有:
- 非侵入式
- 上手快
- 相關服務成熟
上程式碼
大神可以看重點,如果是和我一樣的菜雞就可以按照部落格一步一步做,最後一定會成功讓JSPatch跑起來的
第一步:建立Demo,在ViewController裡新增一個Label,宣告一個test方法來給Label.text賦值
OC:
Swift:
為了方便label就直接在StoryBoard裡拖進來了(不喜歡拖控制元件的小夥伴可以用程式碼建立)
Swift中為每個變數和方法新增dynamic是保證Swift方法都可以被動態替換,這裡涉及到Swift Runtime的知識就不詳細講述了按例貼一篇文章:
Swift Runtime分析:還像OC Runtime一樣嗎?
第二步:開啟JSPatch網站下載SDK: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"]; //用來檢測回撥的狀態,是更新或者是執行指令碼之類的,相關資訊,會列印在你的控制檯 [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 }複製程式碼
到這一步專案配置就完成了,下一步開始發補丁到專案中
第四步:開啟JSPatch官網點選左上角註冊 -> www.jspatch.com/
第五步:建立你的App,名字可以隨便寫,AppID也可以不填
第六步:點選新增APP版本,建立一個App版本
介紹一下建立之後的APP:
- appKey是之後在你專案中啟用JSPatch要用到的
- 新增App版本 是按照你App的Version來建立的(如果version沒寫對會下載不到補丁)
第七步:建立一個main.js檔案並在裡面寫上以下程式碼:
OC
defineClass('ViewController', { test : function() { self.label().setText("label的text被改掉了"); }, })複製程式碼
Swift
defineClass('HotFixDemo.ViewController', { test : function() { self.label().setText("label的text被改掉了"); }, })複製程式碼
Swift覆蓋方法和類的時候要加上專案名,所以規範應該是 專案名.類名(方法名) 註冊類的時候也要加上專案名
第八步:點選剛剛建立的1.0,將儲存好的JS上傳到JSPatch伺服器上,
選擇檔案選擇剛剛建立的main.js (上傳補丁的時候最少要有一個main.js 如果需要上傳多個檔案點選右側加號就可以了)
一定先勾選開發預覽,這樣才能保證測試成功
一切都操作完之後選擇提交
執行你的專案,如果命令列中顯示以下內容就代表你的你的專案已經更新補丁了
因為補丁是先下載再生效的,所以下一次執行你才能看到效果
可以看到我的程式碼給label賦值為aaaa,通過JSPatch將label.text替換掉了
如果遇到什麼問題可以留言給我,我會及時回覆並更新部落格內寫的不足的地方
一些其他的資料:
可能遇到的坑
- JSPatch網站上的版本要一定要和工程裡的一樣
- label的名字別寫錯了..我順手就給寫成別的名字了
- Swift一定要在方法和屬性前加dynamic,如果不是繼承自NSObject的Swift類不能被動態替換
- Swift替換類和方法要比OC在類/方法名之前新增工程名
- 如果專案跑起來控制檯輸出沒有找到文件就是網站上配置錯了
- js上傳的時候一定要加密,一定要加密,一定要加密
基本使用姿勢
發現bug->在專案裡修復bug->將修改後的有問題的類和方法翻譯成js並上傳網站->釋出補丁
這一次的Bug實在是對不起各位使用者老爺,讓我跪著等到加急稽核完畢,並利用這次學會的熱修復技術來保證以後都不會讓各位老爺遇到今天情況了...
8月27日補充
JS一定要加密,下面是方法截圖和文件:
加密方法: