阿里HotFix成功經(jīng)驗流程分享(最全最專業(yè))

登陸官網(wǎng)申請權(quán)限囊陡,開通HotFix支持撞反。

申請權(quán)限.png

一遏片、進入HotFix后臺吮便,配置好后臺數(shù)據(jù)髓需。

二僚匆、找到iOS的SDK白热,下載兩個framework拖進項目:
AliHotFix.framework
AliHotFixDebug.framework

注意: 在上線之前的Release模式下要把AliHotFixDebug.framework移除屋确,此framework僅用于調(diào)試掃碼的時候使用攻臀,本文接下來會講解刨啸。

記得打開Capabilities里面的keychain sharing

經(jīng)阿里技術(shù)團隊解答知道:若使用 XCode8 接入设联,需要在項目 Capabilities 打開 Keychain Sharing 開關(guān),否則在模擬器下載腳本后會出現(xiàn) decompress error, md5 didn't match 錯誤(真機無論是否打開都沒問題)這個選項是為了在模擬器下對patch的驗簽能通過换团。
iOS的keychain提供一種安全保存信息的方式艘包,可以保存密碼等數(shù)據(jù)想虎,而且keychain中的數(shù)據(jù)不會因為你刪除app而丟失舌厨,你可以在重新安裝后繼續(xù)讀取keychain中的數(shù)據(jù)邓线。

三骇陈、必須要使用CocoaPods 集成 SDK 所需依賴你雌,安裝完成之后在項目目錄下執(zhí)行pod init命令婿崭,然后在項目文件夾下創(chuàng)建的podfile文件中添加如下內(nèi)容:

source 'https://github.com/CocoaPods/Specs.git'
source 'http://repo.baichuan-ios.taobao.com/baichuanSDK/AliBCSpecs.git'
 
platform :ios, '7.0'
inhibit_all_warnings!
 
target ‘項目名稱***’ do
    pod 'BCUserTrack'
    pod 'ZipArchive', '~> 1.4.0'
    pod 'wax', :git => 'https://github.com/alibaba/wax.git'
end

(關(guān)于集成pod如果遇到坑氓栈,可留言咨詢)

后臺配置成功之后授瘦,你已經(jīng)獲得了三個參數(shù)App ID提完、App Secret和RSA密鑰丘侠,接下來我們看代碼:

#import <AliHotFix/AliHotFix.h>
//代碼取自官方demo蜗字,最好都寫在AppDelegate里的這個方法中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    //加解密補丁文件的密鑰(該密鑰已加密)
    char aesEncryptKeyBytes[] = {-106,0,-127,-95,-109,-44,-87,84,110,6,-108,-74,-58,-115,37,1,-52,-96,-102,70,-112,73,126,113,-82,120,-72,75,31,-87,-126,75};
    NSData *aesEncryptKeyData = [NSData dataWithBytes:aesEncryptKeyBytes length:sizeof(aesEncryptKeyBytes)];
    //本地自簽名證書RSA公鑰
    char rsaPublicDerBytes[]={48,-126,2,1,48,-126,1,106,2,9,0,-79,22,-42,-112,86,-37,19,-31,48,13,6,9,42,-122,72,-122,-9,13,1,1,5,5,0,48,69,49,11,48,9,6,3,85,4,6,19,2,65,85,49,19,48,17,6,3,85,4,8,19,10,83,111,109,101,45,83,116,97,116,101,49,33,48,31,6,3,85,4,10,19,24,73,110,116,101,114,110,101,116,32,87,105,100,103,105,116,115,32,80,116,121,32,76,116,100,48,30,23,13,49,54,49,48,51,49,48,56,51,53,48,51,90,23,13,50,54,49,48,50,57,48,56,51,53,48,51,90,48,69,49,11,48,9,6,3,85,4,6,19,2,65,85,49,19,48,17,6,3,85,4,8,19,10,83,111,109,101,45,83,116,97,116,101,49,33,48,31,6,3,85,4,10,19,24,73,110,116,101,114,110,101,116,32,87,105,100,103,105,116,115,32,80,116,121,32,76,116,100,48,-127,-97,48,13,6,9,42,-122,72,-122,-9,13,1,1,1,5,0,3,-127,-115,0,48,-127,-119,2,-127,-127,0,-42,18,-126,-97,-3,105,-91,72,24,-128,-121,-53,-39,-111,-65,-128,114,101,109,52,-26,-65,-18,-42,-88,13,77,-86,-118,77,-12,42,5,-14,-100,43,-104,-74,-84,39,-51,-81,-48,16,-28,25,-66,66,29,60,-17,-115,-62,30,-19,-120,-127,72,115,59,126,-83,90,87,119,-125,24,75,-65,-85,-118,-59,89,37,51,-121,4,-95,88,-77,-108,-7,5,-32,115,61,-119,14,44,-90,-40,98,-123,96,-53,-38,-101,-128,-72,78,3,-122,-14,-40,-107,-77,-45,12,81,-78,99,-86,-3,22,-97,95,-54,-24,-96,0,14,-2,-57,-25,-2,-81,51,79,2,3,1,0,1,48,13,6,9,42,-122,72,-122,-9,13,1,1,5,5,0,3,-127,-127,0,-64,-63,-100,-76,-35,115,73,-28,40,-63,126,39,-91,109,48,47,19,113,11,60,85,24,75,123,-81,-41,90,37,-59,-82,-3,115,122,-95,-98,-84,-60,8,-12,36,124,-25,14,105,-108,-108,96,-44,-40,-126,-118,7,57,114,-53,-125,5,-125,111,53,-38,-57,80,-19,14,126,-76,-42,64,-31,52,-21,-121,-100,-109,-53,42,-9,-92,18,-94,-19,-49,55,62,-106,127,23,-23,68,-67,26,-1,39,-29,78,-63,-14,118,-11,-94,61,-67,62,-89,-107,-54,-24,31,86,-47,-63,-28,59,-116,62,48,-112,47,101,-3,114,-13,79,13,4,79,11};
    NSData *rsaPublicDerData = [NSData dataWithBytes:rsaPublicDerBytes length:sizeof(rsaPublicDerBytes)];

    //App Secret
    NSString * secret = @"0826092cd0903caf20815f69578856be";
    //RSA密鑰
    NSString * privateKey = @"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR5mTRZibau72o0SKBmQisFJ98kZwbAT7XbgfMEU4iIKvzRK/87R220or5LtARnKL7XExBMte6GKHI5PSY0gB6tES8Gp155jf7vWGAls2yXfrKxz2AIiwy2jplCBzCH0GlFbhiFbAkW8OwHlHi9rdpQN3lxmq+1qRDjZGN0heED1npg9BObVHf+7ygEAwyrFvDSnBTfzONZUxZwyz9HynLCbhHWqi8vZacJNS+CVTuymHEa7hbSQyUbOb+QTvJyoovP+L9IkpVhdG1mMRFJf9ex9dV9OTOmZXR29MJVsyZmS3YgHoXtphvClXJ8uaXX6ngfFLQgV/6nss2buxz2O6ZAgMBAAECggEAIZCUXwwWIjoQrta2DoSLVzNDYaAJ/rhxoZQBnTPZ+sXzaPrDVfei311edWcMnRCg+hzIujMdKAXkqlfp4YJmc9Qm//NLiTCqbnKqDLAk0EUInj/p6SFzc5t61aVhIFOagYUWrxH4PNUTlt/SzNkfZspyghr8kbzFe3kFJFBR8qJP+YN+EDunDc/ihb7Z6vmApi7vbNlebKoZZnMs0LhlNxm5xmrOUvezScQ8wjT2bNlAO6nAGPj84fAARmZndeS8D0m7tv3jwKZNlkYt+MKUEdKSaeEx6FBAseBVhavBs9LwRWwekY+SvgN/jRXq0BCuPkUVcD9qDuDFLCaXInN+BQKBgQDYc1ffbuMpAtXCznMG+XCwbSHbQ5s6UFKoaUaymnCinxAvH6Zvw2K6BwqkWmwao4QvJcnfkhlsErc46Xc6fqgF0ywc60wE0XHA7HcCtzJO5DP/6NybAFOaRzq2vwfdqFSuTVelrQAbeAkngnbA8K4XSqYP6Qz81V3Wr7jUF8G7zwKBgQCsjvzdKicHRUAvwII3Kcqkoo5ulxW4CWUxkrc0pwVLXI3alhyiSOdLd7gFhnpS9+1kvp8zu5nabM9VGg7krY/MRHqvurRz5RB6l5bxxv5jrHgpMRiQR2+30zda+n/7FwTkMST+FwkSQXSmF/w+AAOyfZoF5CEQTCx1xoqSZAbBFwKBgQCnzSvHfNjAd4EuiAxm0MRLEh/YM15I4/Jgu1Tiq5Y8jGHolnnaVTfZjhHy/mKmeDPGtV3+Y+4veYbvqRcUkxJBice+F7AUYCb28JsG0O1AeevSLj2wMJ2fki7zc79uWMxlYHJdb3QQ14sJRTw5MZ1VUzrQRNUbwXIBOLNqQYygwwKBgFOiagR3rbrkYZvDXlmGM+VftFD9gVVVmGpSheFLIlHIZiiPoQk29IOrXtGuwBL+f1zY1yinwIYRPtwsaROE27FRb3VEtLmHSFlip5I/tIRyzzqHxTQIq6kZAjdiOi1klsZS228bkxX6C6OE9IjIUQJtxf0c+LmBcfsTY45YVL25AoGAM3leDbpcITvQpqanctpVybhkUUgrhXDFYjx/w+QmNuu8eQ9jR8lDsUtihyu3ssPu2g+ieYaoeybPXAC26kb5Y0j+t5A4JINxisNXdJtrplbJgaC7QgN0FmEDnPmTXY0tvRGwX2zL9kOMvogfyvF9DR2CaUyq1JkcJFGhhrM5mdw=";

    // 百川平臺申請的appid,secret,rsaKey.以及本地打包自簽證書的RSA公鑰&本地加密patch密鑰
    [AliHotFix startWithAppID:@"76547-2" secret:secret privateKey:privateKey publicKey:rsaPublicDerData encryptAESKey:aesEncryptKeyData];

    return YES;
}

//在程序每一次重新進入前臺激活時,同步補丁楼吃。
- (void)applicationDidBecomeActive:(UIApplication *)application {
     [AliHotFix sync];
}

還差rsaPublicDerData(本地自簽名證書RSA公鑰)和aesEncryptKeyData(加解密補丁文件的密鑰)兩個參數(shù)。

接下來要特別謹慎對待了亥贸,下載打包工具到桌面,現(xiàn)在你的桌面有個tools文件夾荣挨,里面有三個文件

tool.png

打開終端
第一步:1、cd到tools文件夾甚纲;2介杆、終端輸入AliHotFixCommand的路徑你會得到:

AliHotFixCommand.png

第二步:我們首先進行上圖中的第2步春哨,即:
終端輸入AliHotFixCommand的路徑 -generateRSAKey
會得到

2.2.0png

這是讓你輸入各種信息椰拒,可以直接一直回車凰荚,直到輸入密碼階段浇揩,連續(xù)輸入兩個自定義的密碼(想一個復雜點的密碼,一定要記住你輸入的密碼,不要泄露胳徽,在此階段的第3步會用到這個密碼,以后的補丁文件也會持續(xù)用到缚陷,先規(guī)定為“密碼一”
2.2.1png

你的tools文件夾也會變成這樣:

2.2.3png

意思就是生成了本地自簽名證書.p12和.der

然后嚷节,我們進行圖片(AliHotFixCommand.png)中的第1步(對建立的Patch目錄進行加密打包):
在tools文件夾中創(chuàng)建如圖的目錄結(jié)構(gòu)

lua_patchpng

備注:在src目錄下的lua補丁文件支持多目錄多文件硫痰,patch/lib(非必須目錄) 存放src目錄下lua代碼所需的公共類或工具類代碼

js_patch.png

備注:js補丁文件必須放在patch/src目錄下,只支持單個js補丁文件且文件必須命名為main.js

不管是lua還是js柱徙,src文件夾里面存放的都是補丁代碼,測試的時候可以什么都不放敌完。也可以在放一個彈窗方法調(diào)用蠢挡,這里有個lua的代碼凳忙,方便大家用來測試

//測試代碼
- (void) showHotFix{
    UIAlertView *ceshiview = [[UIAlertView alloc]initWithTitle:@"HotFix" message:@"測試HotFix" delegate:nil cancelButtonTitle:@"OK " otherButtonTitles:nil, nil];
    [ceshiview show];
}
//lua代碼
waxClass{"AViewController"}
function showHotFix(self)
    local ceshiview = UIAlertView:initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles("HotFix","測試HotFix修復后的detail是否改變",nil,"OK ",nil)
    ceshiview:show()
end

解釋一下:waxClass{"AViewController"}指的是AViewController里面的方法勤家,起到定位修改內(nèi)容的作用柳恐,官方文檔有個轉(zhuǎn)換工具乐设,可以把OC代碼轉(zhuǎn)換為js或者lua的代碼點我查看近尚,個人覺得很坑,轉(zhuǎn)換后一定要仔細檢查一遍和媳,轉(zhuǎn)換的語法往往會有錯誤留瞳,一定要仔細檢查她倘。

這里我改變了UIAlertView里message內(nèi)容硬梁,如果message內(nèi)容改變靶溜,也就證明HotFix是work的懒震。還有一點个扰,如果HotFix是work的递宅,也不會走showHotFix方法办龄,可打斷點測試俐填。所以我們應(yīng)該知道,如果修改一個方法中的某一點內(nèi)容英融,需要把整個方法的代碼都打包成補丁上傳后臺驶悟。
可見寫代碼的時候分塊創(chuàng)建是很有必要的痕鳍。

打開終端够庙,輸入命令格式:
COMMAND-PATH –pack PATCH-DIRECTORY APP-VERSION ENCRYPT-KEY PRIVATE-P12-FILE-PASSWORD
參數(shù)說明:
COMMAND-PATH: AliHotFixCommand所在路徑
PATCH-DIRECTORY:patch包所在路徑
APP-VERSION:patch綁定的app版本
ENCRYPT-KEY:加密patch文件的密鑰(備注:長度不超過32位字符串耘眨,自定義的密碼,我們這里成為“密碼二”)
PRIVATE-P12-FILE-PASSWORD:生成RSA密鑰時輸入的密碼(剛才的“密碼一”)

你會得到如圖的patch.zip的補丁包剔难。


patch補丁包.png

在阿里HotFix后臺點擊上傳補丁。

補丁上傳成功.png

問題:上傳了但還沒發(fā)布的補丁怎么刪盎防稹纯趋?
答:補丁不允許刪除的,只允許上傳新補丁去覆蓋冷离,永遠加載同一個版本中最新的補丁吵冒。

上傳成功后點擊“查看詳情”,會看到一個二維碼西剥,就是我們開始提到的
AliHotFixDebug.framework的作用痹栖,真機打開項目會打開攝像頭,掃面這個二維碼就可以測試patch包是否是work的瞭空。


屏幕快照 2016-12-14 13.15.18.png

別急著測試揪阿,還有第3步(獲取運行patch需要的密鑰參數(shù)):
打開終端
命令格式: COMMAND-PATH –encryptKey ENCRYPT-KEY

參數(shù)說明:
COMMAND-PATH: AliHotFixCommand所在路徑
ENCRYPT-KEY:加密文件密鑰(備注:要與打包命令輸入的相一致,也就是我們之前的“密碼二”)

那么在終端中會獲得如下代碼:

char aesEncryptKeyBytes[] = {xxxx};
//加密過后的aesKey二進制流格式
NSData *aesEncryptKeyData = [NSData dataWithBytes:aesEncryptKeyBytes length:sizeof(aesEncryptKeyBytes)];
char rsaPublicDerBytes[]={xxxx};
// 本地自簽名公鑰二進制流格式
NSData *rsaPublicDerData = [NSData dataWithBytes:rsaPublicDerBytes length:sizeof(rsaPublicDerBytes)];

就是在AppDelegate里還缺少的兩個參數(shù):rsaPublicDerData(本地自簽名證書RSA公鑰)和aesEncryptKeyData(加解密補丁文件的密鑰)。

最后確認一下你要測試的是哪個view或者哪個controller的代碼,在那個view或者controller里

#import <AliHotFixDebug/AliHotFixDebug.h>
[AliHotFixDebug showDebug:self];

當進入的時候就會立刻打開攝像頭矿瘦,就可以掃碼測試了琼开。

掃碼錯誤:Patch run error: 未能完成操作躏精。(“”錯誤 -9809箩溃。).
答:打包用的自簽名證書和集成到app的自簽名證書不匹配,建議重新走一遍流程,細心點。
如果patch補丁包成功剔蹋,掃碼會提示:Load patch success.
如果提示Load patch success. 但補丁未生效洛口,個人經(jīng)驗有兩個原因:
1妨马、你的lua代碼或者js代碼語法有問題。
2、可能是你前后用的自定義簽名證書不一致汇歹,建議重新走一遍流程弯囊。

相關(guān)說明(此說明參考自梁炯幸
1、所修改的目標方法折欠,必須在方法調(diào)用之前已把補丁加載完畢酱床,然后在方法調(diào)用時才會生效闲昭。
2簸淀、補丁的下載是異步的令蛉,不會阻塞當前線程弟劲。補丁的下載受網(wǎng)絡(luò)環(huán)境影響庸追。
3簿训、加載過的補丁將會存在于App沙盒膘侮,App每一次啟動都會加載它雕薪,即使斷網(wǎng)。App在同步補丁時發(fā)現(xiàn)沒有更高版本的補丁時勺拣,會繼續(xù)使用本地存放的補丁苇经。所以在百川控制臺停用了所有補丁后施流,App再去同步補丁慎王,依然等同于沒有更高版本補丁,并不會刪除本地補丁。

OK,整個阿里HotFix的流程就結(jié)束了肌蜻。

目前阿里HotFix是免費的骂租,內(nèi)部說今天想實行一元購的活動互站,但為了用戶體驗還是放棄了之景,等到幾個版本的迭代之后阿里HotFix就會收費轻纪,現(xiàn)在嘗試學習一下阿里HotFix的接入還是比較好的校摩。

另外,整個過程要多謝陳老板的幫助浮禾。

個人對于js(具體的編寫方法參考JSPatch基礎(chǔ)用法)和lua的語法不是很熟悉,還需要繼續(xù)深入學習才能準確的使用HotFix線上修復bug鞭铆。個人比較傾向于lua车遂,不知此觀點是否正確衣陶,有關(guān)于lua的書籍和文章蒲跨,還請大家不吝賜教淮菠,積極分享,共同學習。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恋谭,隨后出現(xiàn)的幾起案子糠睡,更是在濱河造成了極大的恐慌,老刑警劉巖疚颊,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狈孔,死亡現(xiàn)場離奇詭異,居然都是意外死亡材义,警方通過查閱死者的電腦和手機均抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其掂,“玉大人油挥,你說我怎么就攤上這事。” “怎么了喘漏?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵护蝶,是天一觀的道長华烟。 經(jīng)常有香客問我翩迈,道長,這世上最難降的妖魔是什么盔夜? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任负饲,我火速辦了婚禮,結(jié)果婚禮上喂链,老公的妹妹穿的比我還像新娘返十。我一直安慰自己,他們只是感情好椭微,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布洞坑。 她就那樣靜靜地躺著,像睡著了一般蝇率。 火紅的嫁衣襯著肌膚如雪迟杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天本慕,我揣著相機與錄音排拷,去河邊找鬼。 笑死锅尘,一個胖子當著我的面吹牛监氢,可吹牛的內(nèi)容都是我干的藤违。 我是一名探鬼主播浪腐,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼顿乒!你這毒婦竟也來了议街?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤淆游,失蹤者是張志新(化名)和其女友劉穎傍睹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犹菱,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拾稳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腊脱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片访得。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悍抑,到底是詐尸還是另有隱情鳄炉,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布搜骡,位于F島的核電站拂盯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏记靡。R本人自食惡果不足惜谈竿,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摸吠。 院中可真熱鬧空凸,春花似錦、人聲如沸寸痢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啼止。三九已至道逗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間族壳,已是汗流浹背憔辫。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仿荆,地道東北人贰您。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像拢操,于是被迫代替她去往敵國和親锦亦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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