iOS App 動(dòng)態(tài)更新

動(dòng)態(tài)更新

? ? 1、控件到 window 的層級關(guān)系:

? ? 2、分析控件的詳細(xì)路徑:

? ? 3乾闰、動(dòng)態(tài)修改控件:

? ? 4、工具篇:

視圖的層級關(guān)系:

? ? 每個(gè) App , 至少有一個(gè)根 Window , 通常情況下我們只用一個(gè) 娄徊。window 有一個(gè) rootViewController , 這就是我們所謂的根視圖 , 我們所有的控制器都是放在 rootViewController 里面的。


如果在項(xiàng)目里有了這么一個(gè)路徑 , 我們可以做什么呢?

? ? * 在當(dāng)項(xiàng)目很復(fù)雜 , 可以其它地方可以直接修改這個(gè)控件的狀態(tài)

? ? * 當(dāng)某個(gè)控件命名存在卻又沒有顯示出來 , 可以通過路徑來輔助查找

? ? * 由服務(wù)器下發(fā)一些配置 , 使用 Runtime 去動(dòng)態(tài)的修改已上線的項(xiàng)目

下面將介紹如何使用代碼來找出這些視圖(控件)的路徑

分析控件的詳細(xì)路徑

1、找出根 Window :

每一個(gè)視圖盅视、控件 , 他們最終的根都是main函數(shù)返回的 application , 通過 [UIApplication sharedApplication] 可以得到 。 application 的 windows 屬性是一個(gè)數(shù)組 , 這里面裝的是這個(gè)應(yīng)用的所有 Window , 我們通常用的是第一個(gè)也就是 application.windows[0]

2萧吠、遍歷視圖 :

得到了 window 對象一切都好辦了 左冬。 然后拿到 window 的 rootViewController , 在獲取 rootViewController 里面所有的 childViewControllers 和 view 里的 subviews , 一直遞歸下去就可以得到當(dāng)前屏幕里所有視圖對象了 , 同時(shí)可以通過 runtime 把它們的 property 狰腌、 delegate 都獲取出來 。

結(jié)合 Reveal 或者 Xcode 自帶的 Captuer View Hiearachy , 我們可以推測一下這兩個(gè)的的實(shí)現(xiàn)原理了 :

? ? 1光坝、根據(jù)應(yīng)用得到根視圖

? ? 2、遞歸獲取里面的所有控件

? ? 3、按照他們的層級關(guān)系一層一層的畫出來

動(dòng)態(tài)修改控件

1芝发、把上面獲取到的所有控件的詳細(xì)信息上傳到服務(wù)器 抄腔。

2、根據(jù)業(yè)務(wù)需求由服務(wù)器給我們下發(fā)對應(yīng)的配置列表 , 以 button 為例 : 配置列表里必須要有 :

? ? 1)、button 的全路徑 : 如 UIWindow -> UIWindow -> UIView -> UIView -> ? ? ?UILayoutContainerView -> UITabBar -> UIView —> UIButton

? ? 2)筏勒、button 的唯一標(biāo)識 : 如 tag 值或自己實(shí)現(xiàn)的一套算法生成的唯一標(biāo)識 , 目的是防止與 button 同一層次的視圖搞混 捐顷。

? ? 3)、 根據(jù)路徑及唯一標(biāo)識來匹配 App 里的控件 , 匹配和上面的查找原理是相通的。

? ? 4)耘沼、 匹配成功代表 button 確實(shí)存在 , 根據(jù)業(yè)務(wù)需求做后續(xù)操作 。

提示: 匹配策略盡可能的多 , 防止意外情況某一兩個(gè)標(biāo)識生成失敗或者生成相同 。

3赃绊、修改 button 的狀態(tài)。

? ? 1)、 如某個(gè)按鈕點(diǎn)了會(huì) Crash 或暫時(shí)不需要被點(diǎn)擊 , 但是又要展示出來 , 可以直接修改 button 的 enabled 屬性 稻扬。

? ? 2)尘吗、 如某業(yè)務(wù)暫時(shí)關(guān)閉 , 可以直接修改入口 按鈕 frame為0 , 前提是要自動(dòng)布局已做好 。

? ? 3)臀晃、 如給購買 按鈕 添加監(jiān)聽事件 addTarget: action: forControlEvents:

target 也可以通過上面 遍歷視圖 獲取到 , action 可以由服務(wù)器下發(fā) , 也可以一開始就寫死 , 等有需求的時(shí)候直接傳不同的參數(shù)就行了 。

4隆圆、 綁定查找控件時(shí) , 這個(gè)界面必須要已經(jīng)初始化完成了才行 , 假如界面還沒生成肯定是查找不到這個(gè)控件的 蹬屹。 這里給大家提供兩種思路 :

? ? 1、使用Runtime Method Swizzing , 直接把修改控件的方法與 didMoveToSuperview 和 didMoveToWindow 動(dòng)態(tài)綁定 , 等這個(gè)控件加載出來之后再去修改 , 查找路徑正確的話肯定就能找到了 虾攻。

? ? 2奇钞、在具體的類里面 , 等控件的初始化方法調(diào)用完后 , 再去執(zhí)行動(dòng)態(tài)修改 , 如在viewDidLoad 里面初始化控件 , 在 viewWillAppear: 里面動(dòng)態(tài)修改 樊拓。

建議使用第一種適用范圍更強(qiáng) 筋夏。

上架后的 應(yīng)用 可能會(huì)遇到的一些突發(fā)狀況 , 未測出的Crash、臨時(shí)改點(diǎn)小需求 , 等等 , 我們總不能每次因?yàn)橐稽c(diǎn)小改動(dòng)就重新提交一次 App Store , 先不說 App Store 的審核時(shí)間 , 頻繁的讓用戶去更新應(yīng)用 , 用戶也會(huì)煩的 乞巧。使用這篇文章所講的來實(shí)現(xiàn)動(dòng)態(tài)更新是再合適不過了 。

首先上面講的 動(dòng)態(tài)更新 是完全脫離出來的一個(gè)模塊 , 跟業(yè)務(wù)邏輯沒有任何關(guān)系 , 只需要部署一次就行了 , 等開發(fā)下一個(gè)項(xiàng)目也可以直接拿過去使用 锨苏。這里的動(dòng)態(tài)更新適用于局部的視圖躺屁、控件的修改 , 如果你有其它需求可以考慮 JSPatch 、wax , 下發(fā)腳本也是一個(gè)不錯(cuò)的選擇 耐亏。

工具篇:

使用一些UI調(diào)試的輔助工具 , 使我們查看視圖在項(xiàng)目中得層次結(jié)構(gòu)更為方便 暇矫。

常用的UI調(diào)試的工具:

Captuer View Hiearachy

Reveal

Xcode自帶的 Captuer View Hiearachy 實(shí)現(xiàn)步驟:

? ? 1、打開Xcode , 運(yùn)行項(xiàng)目 , 選擇最頂部的 Debug

? ? 2囱持、Debug -> View Debugging -> Show View Frames

? ? 3掩幢、Debug -> View Debugging -> Captuer View Hiearachy

Xcode里面就變成了三維的視圖了 , Xcode左側(cè)展示出來的是層級關(guān)系的樹狀圖 能曾。

Reveal的功能相對來說更強(qiáng)大 , 適用于UI調(diào)試視圖查找 。使用方法請看 Reveal集成指南 掀序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惭婿,隨后出現(xiàn)的幾起案子不恭,更是在濱河造成了極大的恐慌,老刑警劉巖财饥,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件换吧,死亡現(xiàn)場離奇詭異,居然都是意外死亡钥星,警方通過查閱死者的電腦和手機(jī)式散,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來打颤,“玉大人暴拄,你說我怎么就攤上這事”嘟龋” “怎么了乖篷?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長透且。 經(jīng)常有香客問我撕蔼,道長豁鲤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任鲸沮,我火速辦了婚禮琳骡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讼溺。我一直安慰自己楣号,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布怒坯。 她就那樣靜靜地躺著炫狱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剔猿。 梳的紋絲不亂的頭發(fā)上视译,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音归敬,去河邊找鬼酷含。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汪茧,可吹牛的內(nèi)容都是我干的第美。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陆爽,長吁一口氣:“原來是場噩夢啊……” “哼什往!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慌闭,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤别威,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后驴剔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體省古,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年丧失,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豺妓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡布讹,死狀恐怖琳拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描验,我是刑警寧澤白嘁,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站膘流,受9級特大地震影響絮缅,放射性物質(zhì)發(fā)生泄漏鲁沥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一耕魄、第九天 我趴在偏房一處隱蔽的房頂上張望画恰。 院中可真熱鬧,春花似錦吸奴、人聲如沸允扇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔼两。三九已至甩鳄,卻和暖如春逞度,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妙啃。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工档泽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揖赴。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓馆匿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親燥滑。 傳聞我的和親對象是個(gè)殘疾皇子渐北,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • App動(dòng)態(tài)更新1、控件到 window的層級關(guān)系:2铭拧、分析控件的詳細(xì)路徑:3赃蛛、動(dòng)態(tài)修改控件:4、工具篇: 視圖的層...
    __Lex閱讀 515評論 0 2
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評論 25 707
  • 當(dāng)個(gè)正常人不好么搀菩? 問這種問題的人有兩種:超凡脫俗的牛逼呕臂,自以為是的傻逼。 我屬于哪種呢肪跋?目測不像第一種歧蒋。 但是 ...
    只有一個(gè)命運(yùn)閱讀 947評論 0 2
  • 人們在面臨痛苦的時(shí)候,心會(huì)變得很小很窄州既,充斥著滿滿的負(fù)能量谜洽。同時(shí)我們所有的負(fù)面情緒在胸腔里肆意。我們在痛苦的深淵里...
    今墨閱讀 1,817評論 0 4