iOS 動態更新

App 動態更新

  • 一、控件到 window 的層級關係:git

  • 二、分析控件的詳細路徑:github

  • 三、動態修改控件:算法

  • 四、工具篇:windows

視圖的層級關係

每一個 App , 至少有一個根 Window , 一般狀況下咱們只用一個 。window 有一個 rootViewController , 這就是咱們所謂的根視圖 , 咱們全部的控制器都是放在 rootViewController 裏面的。數組

Dynamic-image1.jpeg

這個是最簡單的層級關係服務器

若是在項目裏有了這麼一個路徑 , 咱們能夠作什麼呢?app

  • 在當項目很複雜 , 能夠其它地方能夠直接修改這個控件的狀態函數

  • 當某個控件命名存在卻又沒有顯示出來 , 能夠經過路徑來輔助查找工具

  • 由服務器下發一些配置 , 使用 Runtime 去動態的修改已上線的項目佈局

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

分析控件的詳細路徑

一、找出根 Window :

每個視圖、控件 , 他們最終的根都是main函數返回的 application , 經過 [UIApplication sharedApplication] 能夠獲得 。 applicationwindows 屬性是一個數組 , 這裏面裝的是這個應用的全部 Window , 咱們一般用的是第一個也就是 application.windows[0]

二、遍歷視圖 :

獲得了 window 對象一切都好辦了 。 而後拿到 windowrootViewController , 在獲取 rootViewController 裏面全部的 childViewControllersview 裏的 subviews , 一直遞歸下去就能夠獲得當前屏幕裏全部視圖對象了 , 同時能夠經過 runtime 把它們的 propertydelegate 都獲取出來。

結合 Reveal 或者 Xcode 自帶的 Captuer View Hiearachy , 咱們能夠推測一下這兩個的的實現原理了 :

一、根據應用獲得根視圖
二、遞歸獲取裏面的全部控件
三、按照他們的層級關係一層一層的畫出來

動態修改控件

一、把上面獲取到的全部控件的詳細信息上傳到服務器 。
二、根據業務需求由服務器給咱們下發對應的配置列表,以 button 爲例 : 配置列表裏必需要有 :

1)、button 的全路徑 : 如 UIWindow -> UIWindow -> UIView -> UIView -> UILayoutContainerView -> UITabBar -> UIView —> UIButton
2)、button 的惟一標識 : 如 tag 值或本身實現的一套算法生成的惟一標識 , 目的是防止與 button 同一層次的視圖搞混 。
3)、 根據路徑及惟一標識來匹配 App 裏的控件 , 匹配和上面的查找原理是相通的。
4)、 匹配成功表明 button 確實存在 , 根據業務需求作後續操做 。
提示: 匹配策略儘量的多 , 防止意外狀況某一兩個標識生成失敗或者生成相同 。

三、修改 button 的狀態。

1)、 如某個按鈕點了會 Crash 或暫時不須要被點擊 , 可是又要展現出來 , 能夠直接修改 buttonenabled 屬性 。
2)、 如某業務暫時關閉 , 能夠直接修改入口 按鈕 frame爲0 , 前提是要自動佈局已作好 。
3)、 如給購買 按鈕 添加監聽事件 addTarget: action: forControlEvents:
target 也能夠經過上面 遍歷視圖 獲取到 , action 能夠由服務器下發 , 也能夠一開始就寫死 , 等有需求的時候直接傳不一樣的參數就好了 。

四、 綁定查找控件時 , 這個界面必需要已經初始化完成了才行 , 假如界面還沒生成確定是查找不到這個控件的 。 這裏給你們提供兩種思路 :

一、使用Runtime Method Swizzing , 直接把修改控件的方法與 didMoveToSuperviewdidMoveToWindow 動態綁定 , 等這個控件加載出來以後再去修改 , 查找路徑正確的話確定就能找到了 。
二、在具體的類裏面 , 等控件的初始化方法調用完後 , 再去執行動態修改 , 如在viewDidLoad 裏面初始化控件 , 在 viewWillAppear: 裏面動態修改 。
建議使用第一種適用範圍更強 。

上架後的 應用 可能會遇到的一些突發情況 , 未測出的Crash、臨時改點小需求 , 等等 , 咱們總不能每次由於一點小改動就從新提交一次 App Store , 先不說 App Store 的審覈時間 , 頻繁的讓用戶去更新應用 , 用戶也會煩的 。使用這篇文章所講的來實現動態更新是再合適不過了 。

首先上面講的 動態更新 是徹底脫離出來的一個模塊 , 跟業務邏輯沒有任何關係 , 只須要部署一次就好了 , 等開發下一個項目也能夠直接拿過去使用 。這裏的動態更新適用於局部的視圖、控件的修改 , 若是你有其它需求能夠考慮 JSPatch , 下發腳本也是一個不錯的選擇 。

工具篇

使用一些UI調試的輔助工具 , 使咱們查看視圖在項目中得層次結構更爲方便 。
經常使用的UI調試的工具:

  • Captuer View Hiearachy

  • Reveal

Xcode自帶的 Captuer View Hiearachy 實現步驟:

  • 一、打開Xcode , 運行項目 , 選擇最頂部的 Debug

  • 二、Debug -> View Debugging -> Show View Frames

  • 三、Debug -> View Debugging -> Captuer View Hiearachy

Xcode裏面就變成了三維的視圖了 , Xcode左側展現出來的是層級關係的樹狀圖 。

Reveal的功能相對來講更強大 , 適用於UI調試視圖查找 。使用方法請看 Reveal集成指南

相關文章
相關標籤/搜索