以前公司比較純粹,做自己的研發(fā)而已,當時當各種需求不那么純粹時,你可能需要各種嘗試,mark打包frameWork
想把一個功能完整的模塊,打包成frameWork分割開來,首先,打開Xcode,file-->new-->workSpace,新建一個工作空間

第二步,創(chuàng)建frameWork,

此時需要做相關(guān)設(shè)置



設(shè)置完以上步驟后


注意細節(jié)問題,比如info中的development Target最好和要融合的項目保持一致,一些不支持的ARC的第三方庫,要配置支持ARC
打開終端,到該framework路勁,用cocoapod加入要打包的代碼需用的第三方庫,添加成功之后,重新用workspace打開SDK
把要封裝的代碼,放入SDK項目中,commend+b后在product中,生成對應(yīng)的framework
遇到的報錯:
invalid iOS deployment version '--target=i386-apple-ios13.0-simulator', iOS 10 is the maximum deployment target for 32-bit targets
解決方案:

如果需要完整的融合,可能還涉及到要打包bundle資源文件,bundle打包步驟如下
新建project,xcode-->file-->new-->project
選macOS下的bundle

bundle創(chuàng)建之后設(shè)置相關(guān)配置如下圖




把需要打包的xib 圖片等文件,放到該bundle中
分別選擇ios 設(shè)備 和模擬器,commend+b 在product中看見兩個版本的bundle文件
生產(chǎn)bundle資源文件后,對于xib 以及圖片資源的引用,需要注意修改NSString* bundlePath = [[NSBundle mainBundle]pathForResource: @"MyBundle"ofType:@"bundle"];
NSBundle*resourceBundle = [NSBundle bundleWithPath:bundlePath];
圖片獲得bundle中的資源
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SourcesBundle"?ofType:@"bundle"];
NSString?*imgPath= [bundlePath stringByAppendingPathComponent:@"xxx"];
可能出現(xiàn)的問題,
第一:重復(fù)問題,模塊化的代碼,打包后,可能和融合的項目中代碼重復(fù),尤其注意類別代碼,報連接錯誤時,注意看一下錯誤上下文一般會提示重復(fù)的文件類
第二:缺失第三庫庫文件問題,打包的項目里可能存在的第三方庫,需要在當前項目用同樣的方式,比如cocoapod引入
第三:注意第三方API中的framework及bundle資源文件的添加
細節(jié)問題,因人而異不在贅述,打卡,Mark!
關(guān)于真機包和模擬器包合并
1、首先在在連接真機的情況下編譯出一個版本,show in finder可見
2、再次選中模擬器編譯一個版本,編譯成功之后?show in finder可見
3、?輸入 lipo -info加真機上的FW中二進制文件的路徑,回車,最后得到的arm64說明是真機
輸入lipo -info加模擬器FW中二進制文件的路徑,回車,最后得到的i386 x86_64說明是模擬器
4、lipo +空格+ _create+空格+framewrok下二進制文件的目錄+空格+同樣真機framework目錄下二進制文件的目錄+ -output + 空格 + 同樣真機framework目錄下二進制文件的目錄
例如:lipo -create /Users/yonyou/Desktop/10.22號合并FW/真機/YYOUPatProject.framework/YYOUPatProject /Users/yonyou/Desktop/10.22號合并FW/模擬器/YYOUPatProject.framework/YYOUPatProject -output /Users/yonyou/Desktop/10.22號合并FW/真機/YYOUPatProject.framework/YYOUPatProject?
合并出來的包,就是真機FW目錄下的framwork了。根據(jù)上述,由于輸出的文件路徑直接放在了真機FW的文件路徑中,所以此時原來只支持真機的FW已經(jīng)被替換,可以同時支持模擬器和真機,直接放在項目中使用即可。
注意-output在哪個文件夾路徑下,最后合并的二進制文件就在哪個路徑下
最后需要用合并的二進制文件替換原來真機或者模擬器framework下面的二進制文件,才是最后合成適用真機和模擬器的合并包。
如果出現(xiàn):have the same architectures (arm64) and can't be in the same fat output file問題,
XCode12之前:
編譯模擬器靜態(tài)庫支持i386 x86_64兩架構(gòu)
編譯真機靜態(tài)庫支持armv7 arm64兩架構(gòu)
使用lipo -create -output命令可以將兩個庫合并成一個支持模擬器和真機i386 x86_64 armv7 arm64四種架構(gòu)的胖子庫。
XCode12編譯的模擬器靜態(tài)庫也支持了arm64,導(dǎo)致出現(xiàn)真機庫和模擬器庫不能合并的問題。
解決辦法:
Build Settings -> Excluded Architectures里按照這樣設(shè)置一下,再編譯合并就不會報錯了

合并真機及模擬器包的另一種方法?

在Run Script中添加如下代碼,添加完成之后,分別選擇模擬器,和真機,再次cmd+B,成功之后,會自動彈出,對應(yīng)路徑的打好包的SDK,直接使用即可.
if["${ACTION}"="build"]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
# 如果真機包或模擬包不存在,則退出合并
if[ ! -d"${DEVICE_DIR}"] || [ ! -d"${SIMULATOR_DIR}"]
then
exit 0
fi
# 如果合并包已經(jīng)存在,則替換
if[ -d"${INSTALL_DIR}"]
then
rm -rf"${INSTALL_DIR}"
fi
mkdir -p"${INSTALL_DIR}"
cp -R"${DEVICE_DIR}/""${INSTALL_DIR}/"
# 使用lipo命令將其合并成一個通用framework?
# 最后將生成的通用framework放置在工程根目錄下新建的Products目錄下?
lipo -create"${DEVICE_DIR}/${PROJECT_NAME}""${SIMULATOR_DIR}/${PROJECT_NAME}"-output"${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打開目錄
open"${SRCROOT}/Products"
fi