OC 字符匹配小技巧 (模板構(gòu)造)

遇到一個(gè)小需求: 給一個(gè)從 App Store 下載的 ipa 文件重簽名。 這個(gè)需求有點(diǎn)荒謬,但是今天為了做一個(gè)實(shí)驗(yàn),于是就下載了一個(gè)線上的 ipa 文件,然后使用自己的證書重新簽名。

接下來就簡單的介紹一下,在什么也不操作的情況下如何使用自己的證書重新簽名。具體分成一下4個(gè)步驟:

    1. 砸殼。
    1. 給除可執(zhí)行文件之外的 MachO文件的簽名。
    1. 給.app 文件夾簽名。
    1. 重新壓成 zip 文件。

關(guān)于以上的4個(gè)步驟,都不是當(dāng)前簡書所要介紹的重點(diǎn),具體的如何操作,請看我的另一篇簡書:【重組 IPA (打包再簽名) - 窺打包簽名流程】。當(dāng)前簡書的重點(diǎn)是第二步:如何快速的找到 除可執(zhí)行文件之外的 MachO文件?先直觀的看一下這些文件在什么地方:

image.png

如果是正向開發(fā)的話,打包的時(shí)候回自動(dòng)的將使用到的這個(gè)動(dòng)態(tài)庫放到這個(gè) Frameworks 文件夾中。

這里可以手動(dòng)的一個(gè)一個(gè)的將某個(gè)動(dòng)態(tài)庫的 MachO 文件路徑拖到終端,然后執(zhí)行簽名命令, 這當(dāng)然是最笨的方法。用一個(gè)高大上的方式就是代碼實(shí)現(xiàn)。具體的規(guī)律是:所有的文件都在 Frameworks 中,某個(gè)動(dòng)態(tài)庫對應(yīng)的 MachO 文件名等于動(dòng)態(tài)庫名稱。核心代碼如下:

/**
 查找所有動(dòng)態(tài)庫的 MachO 文件路徑

 @param frameworksPath Frameworks的路徑
 @return 返回結(jié)果
 */
- (NSArray*)signPathsWithFrameworksPath:(NSString*)frameworksPath {
    // 所有的子文件路徑
    NSArray* subPaths = [[NSFileManager defaultManager] subpathsAtPath:frameworksPath];
    // 定義一個(gè)模板
    NSString* const templateString = @"#content#.framework/#content#";
    // 所有的匹配的路徑
    NSMutableArray* signPaths = [NSMutableArray array];
    for (NSString* subPath in subPaths) {
        // 子路徑的后段
        NSString* lastPathComponent = subPath.lastPathComponent;
        // 按照模本匹配出的字符串
        NSString* matchString = [templateString stringByReplacingOccurrencesOfString:@"#content#" withString:lastPathComponent];
        // 如果匹配出來的與當(dāng)前的 subPath 相等, 那就是我們所要的
        if ([matchString isEqualToString:subPath]) {
            // 加上簽名前綴
            NSString* signStrig = [NSString stringWithFormat:@"codesign -fs 283(證書的唯一編號)3C15E ./%@", matchString];
            [signPaths addObject:signStrig];
        }
    }
    // 這里的結(jié)果就可以直接放到一個(gè) sh 文件中,直接執(zhí)行就可以了
    return signPaths.copy;
}

以上的代碼,看起來還是很直觀的。比較關(guān)鍵的一句是:

// 定義一個(gè)模板
NSString* const templateString = @"#content#.framework/#content#";

這只是一個(gè)簡單的例子,如果使用其它的方法,代碼量也相差不大,但是在有的場合使用這樣的模板還是挺方便的。比如前不久做了一個(gè)代碼混淆的功能,其中有一個(gè)添加垃圾代碼的功能。添加垃圾代碼有兩個(gè)核心的功能是:方法實(shí)現(xiàn)體與調(diào)用方法體。
可以先思考一下,如果不使用模板的話,那代碼會(huì)很復(fù)雜,各種的字符串拼接。如果使用了模板,我們可以直接在模板中做替換即可。比如我的其中的一個(gè)方法調(diào)用模板是這樣定義的:

// 調(diào)用模板
#define CodeODictionaryStringArrayCall @"[self #paramString#:#paramStringValue# #paramArray#:#paramArrayValue#];";

這是一個(gè)字符串的宏定義,當(dāng)然也可以寫成字符串常量。我簡單的介紹一下這個(gè)方法調(diào)用模板結(jié)構(gòu):都是 self 調(diào)用,第一個(gè)參數(shù)是一個(gè)字符串,但是 SEL 段是隨機(jī)生成的,傳的參數(shù)也是隨機(jī)生成的數(shù)組,第二個(gè)參數(shù)不用解釋應(yīng)該就懂。
如果不用模板,那就會(huì)使用各種的拼接,代碼看起來還特別的凌亂,尤其的隨機(jī)生成方法實(shí)現(xiàn)體。在這里也說明一個(gè)問題,所謂的垃圾代碼的隨機(jī)生成,也并非完全的隨機(jī),再怎么隨機(jī),都應(yīng)該是有一定的套路的,至少要保證隨機(jī)生成的代碼運(yùn)行不報(bào)錯(cuò)吧。

到這里,當(dāng)前簡書想要介紹的核心內(nèi)容就結(jié)束了。上面的內(nèi)容有點(diǎn)亂了,copy 一下標(biāo)題吧:OC 字符匹配小技巧 (模板構(gòu)造)

推薦兩篇文章:

1、我的簡書 重組 IPA (打包再簽名) - 窺打包簽名流程。
2、 You should blog even if you have no readers

添加于 2018-11-07

今天在看 喵神VVDocumenter 發(fā)現(xiàn),他在文檔字符處理的時(shí)候,使用了另一種思路,感覺挺棒的,所以想借助這篇簡書,直接分享一下。
這個(gè)工具的功能是自動(dòng)生成注釋模板:或枚舉、或結(jié)構(gòu)體、或方法。默認(rèn)由 /// 觸發(fā),核心代碼在 -[VVDocumenterManager textStorageDidChange:] 中:

image.png

在喵神的這段代碼中,借助 NSPasteboard 做文本的替換,可謂 絕配!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容