早在2015年蘋果推出了Xcode7的時候庶香,.tbd文件也隨之產(chǎn)生香璃,它的出現(xiàn)取代了我們熟悉的 .dylib会涎。
那么.tbd文件到底是什么呢熊榛?有什么用讼昆?怎么用萧求?接下來我們一點一點來揭開它的面紗其兴。
1. tbd介紹
tbd全稱是text-based stub libraries,本質(zhì)上就是一個YAML描述的文本文件夸政。YAML是一個可讀性高元旬,用來表達(dá)數(shù)據(jù)序列化的格式。
tbd用于記錄鏈接動態(tài)庫的必要信息守问,包括動態(tài)庫導(dǎo)出符號法绵、動態(tài)庫的架構(gòu)信息、動態(tài)庫的依賴信息酪碘、動態(tài)庫的鏈接路徑等朋譬。如下圖:
2. tbd生成原理
tbd格式文件,本身是通過Xcode內(nèi)置工具tapi-installapi專門來生成的兴垦,具體路徑為:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/tapi installapi
3. tbd文件生成
創(chuàng)建一個名為JQTestTdb.framework這樣一個動態(tài)庫framework徙赢,如何生成tbd格式文件?
首先來到Build Setting探越,找到Text-Based API狡赐,將Supports Text-Based InstallAPI設(shè)置為Yes:
然后,通過Other Text-Based InstallAPI Flags給tapi-installapi工具傳遞參數(shù)钦幔,常用的參數(shù)有:
-ObjC:將輸入文件視為Objective-C文件(默認(rèn))
-ObjC++:將輸入文件視為Objective-C++文件
-x<語言>:值為c枕屉、c++、Objective-c和Objective-c++
-Xparser <arg>:傳遞參數(shù)給clang parser鲤氢。常用參數(shù)有:-Wno-deprecated-declarations搀擂、-Wno-unavailable-declarations
-exclude-public-header <path>:引入的需要解析的public頭文件路徑
4. tbd文件的使用
第一步,新建一個LoginApp的項目卷玉,將JQTestTdb文件夾拷貝到項目根目錄下哨颂,我們可以看到JQTestTdb文件夾下只有Headers和JQTestTdb.tbd文件,這個也就是要暴露給外部的文件相种,類似于系統(tǒng)提供的tbd文件
第二步威恼,在ViewController中引入頭文件,在viewDidLoad中打印一下JQTestTdbPerson的實例對象,如下圖
第三步箫措,這時候編譯會報錯 Undefined symbol:OBJC_CLASS$_JQTestTdbPerson
我們將JQTestTdb.tbd直接拖到Framework目錄下腹备,如下圖,再編譯斤蔓,通過植酥!
第四步,運行項目附迷,會在運行時報
dyld: Library not loaded: @rpath/JQTestTdb.framework/JQTestTdb
Reason: image not found
如下圖:
第五步,我們將之前生成好的JQTestTdb.framework手動copy到/Users/{userName}/Library/Developer/Xcode/DerivedData/LoginApp-ejzarlssezrclpgjnslulafmqgpb/Build/Products/Debug-iphonesimulator/LoginApp.app/Frameworks目錄下哎媚,這個目錄怎么找喇伯?找到項目的Products,右鍵選中.app文件在Finder中顯示拨与,然后選中.app文件稻据,顯示包內(nèi)容,就可以看到Frameworks文件夾了买喧。(ps:當(dāng)然這個也可以用腳本來copy捻悯,只要指定好相應(yīng)的路徑就可以了)
第六步,再次運行項目淤毛,通過今缚!打印出JQTestTdbPerson的實例對象,結(jié)束低淡!