WaxPatch在iOS客戶端中的一種應用

2021-07-10 10:28:13 字數 2129 閱讀 2973

為什麼需要 waxpatch

什麼是 waxpatch

迄今為止,指令碼語言中執行速度最快的是 lua。lua 語言由巴西里約熱內盧天主教大學的 roberto ierusalimschy、waldemar celes 和 luiz henrique de figueiredo 於 1993 年開發的。其最初的設計目的是提供乙個方便嵌入到應用程式中得指令碼語言。lua 語言完全使用 ansi c 實現,其設計精巧,**優美。lua 的直譯器總共在 200k 大小,而且執行速度大約是 c 語言的 1/5,語法比較簡單,即使不是專業的程式設計人員也容易掌握。

《魔獸世界》內的lua編輯器

由於 lua 程式設計簡單,執行速度快,在 ios 上, 乙個支援使用 lua 語言編寫 ios 應用的專案 wax 誕生了。wax 專案允許使用者使用 lua 語言調動蘋果 ios sdk 的功能,進行應用程式的開發。

wax patch 專案是由 wax 專案衍生而來,wax patch 不僅僅允許使用者使用 lua 呼叫 ios sdk 和應用程式內部的 api, 而且使用了 objective-c runtime 的 class_replacemethod 呼叫替換應用程式內部由 objective-c 編寫的類方法,從而達到功能微調或者缺陷修復的目的。

wax/waxpatch 主要特點:

● 所有 objective-c 呼叫介面構建在 objective-c runtime 之上,所以其呼叫 objective-c 的 api 方式非常方便,不像呼叫 c/c++ 哪樣,必須先為 lua 編寫呼叫介面(有些技術可以幫助 lua 呼叫 c/c++ 編寫的動態庫而不必事先編寫呼叫介面, 但是在 ios 上不能呼叫應用程式自己編寫的 api)。

● 對於 objective-c 和 lua 之間的資料型別轉換進行了封裝,使得開發者不必關心 lua 和 objective-c 的資料型別轉換,方便開發。

waxpatch 工作原理

objectvie-c 語言的特性和實現機制決定了任何其他指令碼語言對其進行呼叫都很方便。主要原因在於 objective-c runtime 提供了對於 類/物件 等 oc 型別的反射和自省機制。

相關的 api 如下:

typedefstruct objc_class *class;

structobjc_object ;

typedefstruct objc_object *id;

typedefstruct objc_selector *sel;

typedefid (*imp)(id, sel, ...);

selsel_getuid(const char *str);

constchar *object_getclassname(id obj);

classobjc_getclass(const char *name);

methodclass_getinstancemethod(class cls, sel name);

methodclass_getclassmethod(class cls, sel name);

impclass_getmethodimplementation(class cls, sel name);

impclass_replacemethod(class cls, sel name, imp imp, const char *types);

藉由以上 api,則可以通過字串來動態呼叫 objective-c 的類和物件的方法。

wax/waxpatch 呼叫 objective-c 並不是簡單得對 objective-c runtime 的 api 進行 1 對 1 得封裝,而是把所有的 objective-c 的物件\類\函式\等抽象成乙個 waxinstance,對 waxinstance 進行操作。而 waxpatch 則對 waxinstance 的元表的 __newindex 屬性進行改寫,呼叫 class_replacemethod 方法改寫父類的函式實現,使用 forwardinvocation 機制把針對父類的呼叫方法**到 lua 改寫的類方法裡面。

動態補丁流程

我們在一些專案中使用 waxpatch 來實現熱更新機制,主要的流程如下所示。

1

補丁包發布流程

2客戶端請求補丁流程

3 客戶端使用補丁流程

iOS 客戶端學習 筆記

是否按照整頁來滾動檢視 scrollview pagingenabled yes 是否開啟滾動效果 scrollview scrollenabled yes 是否可以邊緣彈動效果 scrollview bounces yes 是否可以橫向彈動效果 scrollview alwaysbouncehor...

瘦客戶端 胖客戶端 智慧型客戶端

胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...

在mysql客戶端新增新的 客戶端命令

在mysql中命令分為兩大類,一類是在客戶端解析執行的,如help,quit等,另一類是在服務端解析 執行 的,如select,insert等。注 在客戶端執行的,有的也要呼叫服務端。本文主要介紹如何給mysql客戶端新增新的客戶端命令。用例 新增乙個命令 exec plan e 功能是類似於命令g...