登陸官網(wǎng)申請權(quán)限囊陡,開通HotFix支持撞反。
一遏片、進入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文件夾荣挨,里面有三個文件
打開終端
第一步:1、cd到tools文件夾甚纲;2介杆、終端輸入AliHotFixCommand的路徑你會得到:
第二步:我們首先進行上圖中的第2步春哨,即:
終端輸入AliHotFixCommand的路徑 -generateRSAKey
會得到
這是讓你輸入各種信息椰拒,可以直接一直回車凰荚,直到輸入密碼階段浇揩,連續(xù)輸入兩個自定義的密碼(想一個復雜點的密碼,一定要記住你輸入的密碼,不要泄露胳徽,在此階段的第3步會用到這個密碼,以后的補丁文件也會持續(xù)用到缚陷,先規(guī)定為“密碼一”)
你的tools文件夾也會變成這樣:
意思就是生成了本地自簽名證書.p12和.der
然后嚷节,我們進行圖片(AliHotFixCommand.png)中的第1步(對建立的Patch目錄進行加密打包):
在tools文件夾中創(chuàng)建如圖的目錄結(jié)構(gòu)
(備注:在src目錄下的lua補丁文件支持多目錄多文件硫痰,patch/lib(非必須目錄) 存放src目錄下lua代碼所需的公共類或工具類代碼)
(備注: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的補丁包剔难。
在阿里HotFix后臺點擊上傳補丁。
問題:上傳了但還沒發(fā)布的補丁怎么刪盎防稹纯趋?
答:補丁不允許刪除的,只允許上傳新補丁去覆蓋冷离,永遠加載同一個版本中最新的補丁吵冒。
上傳成功后點擊“查看詳情”,會看到一個二維碼西剥,就是我們開始提到的
AliHotFixDebug.framework的作用痹栖,真機打開項目會打開攝像頭,掃面這個二維碼就可以測試patch包是否是work的瞭空。
別急著測試揪阿,還有第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的書籍和文章蒲跨,還請大家不吝賜教淮菠,積極分享,共同學習。