因?yàn)檫@兩天有點(diǎn)時(shí)間,所以就想做個(gè)frameWork包試試盒件,雖然還留下了一點(diǎn)點(diǎn)問(wèn)題蹬碧,但是總的來(lái)說(shuō)還算是不錯(cuò)的,閑話(huà)少扯炒刁,正題開(kāi)始锰茉。
Xcode創(chuàng)建framework包的本身步驟很簡(jiǎn)單,但是過(guò)程中卻有著不少的坑切心,我在創(chuàng)建一個(gè)framework包的時(shí)候可能也只是涉及到了我需要使用的范圍內(nèi)飒筑,所以我也僅對(duì)我所用的范圍進(jìn)行一篇說(shuō)明文章。
FrameWork的創(chuàng)建
-
這個(gè)都挺簡(jiǎn)單的绽昏,就像你創(chuàng)建一個(gè)新工程一樣协屡,只是選擇的功能不同
2.創(chuàng)建好之后這里面可以添加任何你想打包在一起的功能類(lèi)。
這個(gè)頭文件就是引用你自己的功能類(lèi)了全谤,在這個(gè)文件里面下面的這行英文告訴了我們一個(gè)引用類(lèi)的標(biāo)準(zhǔn)肤晓,但是我試了下不用尖括號(hào)引用功能類(lèi),但是也能被引用到认然。這應(yīng)該類(lèi)似一個(gè)標(biāo)準(zhǔn)吧补憾,所以這里還是用尖括號(hào)好一點(diǎn)。
3.引用完了之后在打包之前有幾個(gè)地方需要注意一下卷员,首先記得在general中構(gòu)建你需要的版本盈匾。
關(guān)于是選擇的是制作動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)這個(gè)看個(gè)人,Mach-O Type->Embedded Framework/Static Framework
其他還有要在A(yíng)rchitectures支持一些類(lèi)型毕骡,但是我這邊Xcode版本是10.2有些東西都有削饵,所以我也沒(méi)去管這一塊了。
4.在Edit Scheme -> Run將Debug改為了release未巫,網(wǎng)上其他文章說(shuō)這個(gè)對(duì)系統(tǒng)型號(hào)有影響窿撬,但是我這版直接設(shè)置release了也就不管了。
5.在bundlesetting里面將bitcode 設(shè)置為NO
6.關(guān)于公開(kāi)的頭文件選擇叙凡,這個(gè)都看自己個(gè)人想公開(kāi)的就都拖到public劈伴,不想的話(huà)就private或者project
到這里差不多可以導(dǎo)出我們自己的庫(kù)了,我這里用的Xcode里面自帶的功能導(dǎo)出的這樣好像沒(méi)有存在什么模擬器和真機(jī)的區(qū)別都是可以使用的
添加完成后再利用腳本生成靜態(tài)庫(kù)并導(dǎo)出到文件夾
!/bin/sh
要build的target名
TARGET_NAME=1 ]]
then
TARGET_NAME={SRCROOT}/${PROJECT_NAME}_Products/"
創(chuàng)建輸出目錄握爷,并刪除之前的framework文件
mkdir -p "{UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
分別編譯模擬器和真機(jī)的Framework
xcodebuild -target "{CONFIGURATION} -sdk iphoneos BUILD_DIR="{BUILD_ROOT}" clean build
xcodebuild -target "{CONFIGURATION} -sdk iphonesimulator BUILD_DIR="{BUILD_ROOT}" clean build
拷貝framework到univer目錄
cp -R "{CONFIGURATION}-iphonesimulator/{UNIVERSAL_OUTPUT_FOLDER}"
合并framework跛璧,輸出最終的framework到build目錄
lipo -create -output "{TARGET_NAME}.framework/{BUILD_DIR}/{TARGET_NAME}.framework/{BUILD_DIR}/{TARGET_NAME}.framework/${TARGET_NAME}"
刪除編譯之后生成的無(wú)關(guān)的配置文件
dir_path="{TARGET_NAME}.framework/"
for file in ls {file} =~ ".xcconfig" ]]
then
rm -f "{file}"
fi
done
判斷build文件夾是否存在严里,存在則刪除
if [ -d "{SRCROOT}/build"
fi
rm -rf "{CONFIGURATION}-iphonesimulator" "{CONFIGURATION}-iphoneos"
打開(kāi)合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"
將上面的腳本復(fù)制到下圖顯示的地方
最后就是導(dǎo)出了
target一定要選對(duì)你創(chuàng)建的aggregate名字的那個(gè),然后commd+b編譯完成就能自動(dòng)彈出輸出靜態(tài)庫(kù)的文件夾赡模,之后直接拿出來(lái)導(dǎo)入到其他工程引用庫(kù)里面的文件就可以使用了田炭。
以上則是Xcode10.2Framework靜態(tài)庫(kù)的創(chuàng)建到導(dǎo)入其他工程的全部過(guò)程,可能有些地方說(shuō)的不是很詳細(xì),不過(guò)這僅僅是我制作自己的庫(kù)的過(guò)程漓柑。
在Framework靜態(tài)庫(kù)和Framework動(dòng)態(tài)庫(kù)的使用中有點(diǎn)區(qū)別應(yīng):
靜態(tài)庫(kù)直接導(dǎo)入到項(xiàng)目里面就可以直接調(diào)用相應(yīng)的方法教硫。
接下來(lái)就是關(guān)于創(chuàng)建bundle文件。
bundle文件我只建議將圖片資源放進(jìn)去辆布,如果有xib的文件我實(shí)在是不建議一起放進(jìn)去瞬矩,因?yàn)樵谑褂胋undle里面的xib文件時(shí)候會(huì)多了幾行代碼,還不如我直接在外面使用锋玲。如果你不嫌麻煩的話(huà)可以放進(jìn)去景用。
這樣就創(chuàng)建好了,之后的就是做一些配置然后和導(dǎo)出靜態(tài)庫(kù)一樣的操作惭蹂。
選中你的bundle文件并將你想要放進(jìn)去的圖片或者xib資源點(diǎn)加號(hào)添加進(jìn)去
之后就選中bundle文件右鍵show in finder 找到復(fù)制出來(lái)就行了伞插。
關(guān)于bundle包中圖片資源以及nib資源的使用(因?yàn)榘褁ib放入bundle之后都轉(zhuǎn)換成了nib)
VC
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
//在這個(gè)路徑下找到子bundle的路徑
NSString *path = [bundle pathForResource:@"StaticFramework_Xib" ofType:@"framework"];
NSBundle *SDKBundle = [NSBundle bundleWithPath:path];
FrameworkVC *fw = [[FrameworkVC alloc] initWithNibName:@"FrameworkVC" bundle:SDKBundle];
[self presentViewController:fw animated:YES completion:nil];
Cell
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"do_Album" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
UINib *nib = [UINib nibWithNibName:cellID bundle:bundle];
[_collectionView registerNib:nib forCellWithReuseIdentifier:cellID];
nibsRegistered = YES;
圖片
NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"APPBaseSDKBundle" withExtension:@"bundle"]];
UIImage *iv = [UIImage imageNamed:@"zhuanqian" inBundle:bundle compatibleWithTraitCollection:nil];
//或
UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(0,100, 50, 50)];
img.image = [UIImage imageNamed:@"APPBaseSDKBundle.bundle/zhuanqian"];
以上則是靜態(tài)庫(kù)以及bundle資源的創(chuàng)建和使用。
下面說(shuō)下還有幾個(gè)注意的地方
1.使用庫(kù)的時(shí)候報(bào):unrecognized selector sent to
因?yàn)閹?kù)里有分類(lèi)盾碗,使用庫(kù)的時(shí)候媚污,調(diào)用分類(lèi)的方法就會(huì)這樣報(bào)錯(cuò),要修改使用庫(kù)的項(xiàng)目的鏈接配置廷雅。
(1)如果只有分類(lèi)耗美,把Build Settings里的Other Linker Flags修改為-ObjC;
(2)如果庫(kù)里同時(shí)有類(lèi)和分類(lèi)航缀,把Build Settings里的Other Linker Flags修改為:(第二個(gè)可以把庫(kù)拖進(jìn)去商架,再添加"/庫(kù)名")
-force_load
(SRCROOT)/Test/Resource/Test.framework/Test)
2.使用庫(kù)的時(shí)候報(bào):Reason: image not found(這個(gè)我沒(méi)遇到過(guò)我也是找到網(wǎng)上的資料有說(shuō)讓大家知道下)
將生成庫(kù)的target里的Build Settings里的Mach-O Type修改為Static Library,重新生成庫(kù)
3.使用庫(kù)的時(shí)候芥玉,編譯報(bào):ld: symbol(s) not found for architecture
因?yàn)閹?kù)用到了第三方庫(kù)蛇摸,而使用庫(kù)的項(xiàng)目沒(méi)有。把需要的第三方庫(kù)添加進(jìn)來(lái)飞傀。
以上本次文章到這里就結(jié)束了皇型,自己也有過(guò)網(wǎng)上找不少資料,但是都有點(diǎn)零零散散砸烦,我這個(gè)算是通過(guò)自己的實(shí)際操作結(jié)合來(lái)做了一篇這樣的文章,如果有不對(duì)的地方多謝大家指出绞吁。