Hot Patch工具Rollout

最近在iOS上又出現(xiàn)了一個(gè)熱更新的工具,rollout惩嘉,小小的體驗(yàn)了一番罢洲。

簡(jiǎn)介

它在編譯期間執(zhí)行一個(gè)upload_dsym的腳本,將收集到的文件符號(hào)dsym上傳到其服務(wù)器文黎,這樣我們就可以在它提供的后臺(tái)操作dashboard中惹苗,選擇對(duì)應(yīng)的app,選擇已存在的方法耸峭,進(jìn)行編輯桩蓉,更改返回值,替換參數(shù)劳闹,添加邏輯等等院究。還可以添加新的方法,但是類必須存在本涕,還能為缺失的方法提供實(shí)現(xiàn)业汰。

主要技術(shù)也是JavaScriptCore和Runtime。在dashboard中添加hot patch之后菩颖,客戶端重新啟動(dòng)样漆,會(huì)拉取新的配置。但在試驗(yàn)中晦闰,不是很及時(shí)放祟,要啟動(dòng)幾次才能切到新的配置,可能跟服務(wù)器在國(guó)外有關(guān)鹅髓,還有可能就是拉取到配置之后舞竿,要patch的動(dòng)作已經(jīng)完成,這種在下次啟動(dòng)就可以了窿冯。當(dāng)在工程中新添加類/方法時(shí)骗奖,在啟動(dòng)后也會(huì)將符號(hào)上傳。但是不能立馬在dashboard中看到對(duì)應(yīng)的類醒串。問(wèn)了rollout的工作人員执桌,說(shuō)是會(huì)有幾分鐘的延遲,可以過(guò)段時(shí)間刷新頁(yè)面看看芜赌。

11@2x.png

安裝

可以通過(guò)Cocoapods或者下載他們提供的工具來(lái)安裝SDK仰挣。

我是通過(guò)Cocoapods。

1@2x.png

另外缠沈,我們可以添加options膘壶,輸出調(diào)試信息错蝴。

RolloutOptions *option = [[RolloutOptions alloc] init];
option.verbose = RolloutOptionsVerboseLevelDebug;

[Rollout setupWithKey:@"5714eaa036053a902868e088"
    #ifdef DEBUG
        developmentDevice:YES
    #endif
     options:option];

下午操作的時(shí)候按照它的提示,在前5步完成之后颓芭,compile的時(shí)候出現(xiàn)了錯(cuò)誤顷锰。Build Phase-->Rollout.io dsym upload中路徑不存在的問(wèn)題,后來(lái)跟rollout的人反饋了這個(gè)問(wèn)題亡问,回復(fù)說(shuō)是個(gè)bug官紫,會(huì)在下次release中fix。但是現(xiàn)在晚上再重試已經(jīng)修復(fù)了州藕。真有效率啊束世。
在運(yùn)行起來(lái)之后,Waiting For App會(huì)變成Done床玻』偕妫可以進(jìn)行下一步添加hot patch了。

添加hot patch

1锈死、你可以搜索想要的方法名薪丁。

2@2x.png

為了方便,我們選擇[ViewController viewDidLoad]方法馅精。

  • toggleJS是讓我們自己添加js代碼严嗜,寫(xiě)邏輯。
  • Before the function有2種操作洲敢,一種是彈個(gè)alert漫玄,可以自己設(shè)置title,msg等压彭。另一種是進(jìn)行事件統(tǒng)計(jì)睦优。
  • ConditionalPatch是添加patch觸發(fā)的條件,可設(shè)置系統(tǒng)版本壮不,手機(jī)型號(hào)汗盘。
  • HotPatch Type是是否允許使用patch。
5@2x.png

下面我們就簡(jiǎn)單的選擇Before the function添加個(gè)alert询一。


4@2x.png

然后隐孽,重新運(yùn)行。有時(shí)候并不能馬上看到效果健蕊,因?yàn)樗钱惒饺ダ⌒碌呐渲昧庹螅渲美』貋?lái)之后,在下次啟動(dòng)時(shí)生效缩功。部分配置如下晴及。


{
    "__v" = 0;
    "_id" = 5714f968cfbc4acb63bdc419;
    "app_version" = 5714eeb692e27ab318a043ba;
    bucket = sandbox;
    "creation_date" = "2016-04-18T15:12:40.656Z";
    data =     (
                {
            class = Test;
            configuration = "Ui5OU0NsYXNzRnJvbVN0cmluZygnVUlBcHBsaWNhdGlvbicpLmNhbGwoJ3NoYXJlZEFwcGxpY2F0aW9uJykuY2FsbCgnb3BlblVSTDonLCBSLk5TQ2xhc3NGcm9tU3RyaW5nKCdOU1VSTCcpLmNhbGwoJ1VSTFdpdGhTdHJpbmc6JywgJ2h0dHA6Ly93d3cuYmFpZHUuY29tJykpOwo=";
            configurationType = javascript;
            methodType = instance;
            selector = test;
            signature = "()->Void";
            swizzlingType = createImplementation;
        },
                {
            class = ViewController;
            configuration = Ui5OU0NsYXNzRnJvbVN0cmluZygnTXlPYmplY3QnKS5jYWxsKCduZXcnKS5jYWxsKCdzYXknKTsK;
            configurationType = javascript;
            methodType = instance;
            selector = viewDidLoad;
            signature = "()->Void";
            swizzlingType = replaceImplementation;
        }
    );
}

運(yùn)行結(jié)果如下:


6@2x.png

2、Polyfille method
可以理解為方法替代嫡锌。只能給已存在的類添加方法虑稼×斩ぃ可以添加新的方法,或者是給已聲明未實(shí)現(xiàn)的方法添加實(shí)現(xiàn)蛛倦。
下面的例子中因?yàn)閇MyObject test]未實(shí)現(xiàn)槽卫,在MyViewController里面ViewDidload方法調(diào)用了[MyObject test]方法,正常情況下是跳轉(zhuǎn)到MyViewController頁(yè)面就會(huì)崩潰的胰蝠。等下用hot patch來(lái)解決。經(jīng)測(cè)試震蒋,如果實(shí)現(xiàn)[MyObject test]茸塞,就會(huì)走原有邏輯,patch就不起作用了查剖。如果要修改已存在方法钾虐,可參照第三條。

@interface MyObject : NSObject

- (void)say;

// 未實(shí)現(xiàn)笋庄,之后會(huì)用hot patch實(shí)現(xiàn)
- (void)test;

- (void)calculate:(int)a;

@end

@implementation MyObject

- (void)say {
    NSLog(@"I am MyObject");
}

- (void)calculate:(int)a {
    NSLog(@"calculate:%d", a);
}
@end

我們添加了[MyObject test]方法效扫。

7@2x.png

然后添加實(shí)現(xiàn)。這里我們打開(kāi)百度頁(yè)面直砂。js的寫(xiě)法也比較簡(jiǎn)單菌仁。

R.NSClassFromString('UIApplication').call('sharedApplication').call('openURL:', R.NSClassFromString('NSURL').call('URLWithString:', 'http://www.baidu.com'));

調(diào)用方法就用call,傳參數(shù)静暂,直接跟在后面济丘。

8@2x.png

運(yùn)行,跳轉(zhuǎn)到MyViewController洽蛀,會(huì)跳轉(zhuǎn)到web摹迷。

10@2x.png

3、修改已存在的方法

還是拿[ViewController viewDidLoad]來(lái)說(shuō)郊供,在里面調(diào)用方法[MyObject say]峡碉。選擇Toggler JS。[MyObject say]是在工程中的方法驮审。

var obj = R.NSClassFromString('MyObject').call('new')
obj.call('say')
self.originalImplementation();
QQ20160419-5@2x.png

再次運(yùn)行鲫寄。

4、修改參數(shù)值
將calculate參數(shù)為10疯淫,修改成20塔拳。

12@2x.png

在ViewController里

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    MyObject *obj = [[MyObject alloc] init];
    
    [obj calculate:10];
}

運(yùn)行幾次,發(fā)現(xiàn)的確是輸出了20峡竣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靠抑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子适掰,更是在濱河造成了極大的恐慌颂碧,老刑警劉巖荠列,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異载城,居然都是意外死亡肌似,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)诉瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)川队,“玉大人,你說(shuō)我怎么就攤上這事睬澡」潭睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵煞聪,是天一觀的道長(zhǎng)斗躏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昔脯,這世上最難降的妖魔是什么啄糙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮云稚,結(jié)果婚禮上隧饼,老公的妹妹穿的比我還像新娘。我一直安慰自己静陈,他們只是感情好桑李,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窿给,像睡著了一般贵白。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崩泡,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天禁荒,我揣著相機(jī)與錄音,去河邊找鬼角撞。 笑死呛伴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谒所。 我是一名探鬼主播热康,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劣领!你這毒婦竟也來(lái)了姐军?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奕锌,沒(méi)想到半個(gè)月后著觉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惊暴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年饼丘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽话。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肄鸽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出油啤,到底是詐尸還是另有隱情典徘,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布村砂,位于F島的核電站,受9級(jí)特大地震影響屹逛,放射性物質(zhì)發(fā)生泄漏础废。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一罕模、第九天 我趴在偏房一處隱蔽的房頂上張望评腺。 院中可真熱鬧,春花似錦淑掌、人聲如沸蒿讥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芋绸。三九已至,卻和暖如春担敌,著一層夾襖步出監(jiān)牢的瞬間摔敛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工全封, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留马昙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓刹悴,卻偏偏與公主長(zhǎng)得像行楞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子土匀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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