關(guān)于打包frameWork

以前公司比較純粹,做自己的研發(fā)而已,當時當各種需求不那么純粹時,你可能需要各種嘗試,mark打包frameWork

想把一個功能完整的模塊,打包成frameWork分割開來,首先,打開Xcode,file-->new-->workSpace,新建一個工作空間

創(chuàng)建完成后,把他放在,桌面提前建好的文件夾

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


創(chuàng)建好frameork

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



第一步設(shè)置



第二步設(shè)置


第三步設(shè)置

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


把要暴露的文件放在public


暴露在外的文件,放在.h中

注意細節(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


解決方案:

圖中設(shè)置修改為如圖standard

如果需要完整的融合,可能還涉及到要打包bundle資源文件,bundle打包步驟如下

新建project,xcode-->file-->new-->project

選macOS下的bundle


bundle

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





設(shè)置完成

把需要打包的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è)置一下,再編譯合并就不會報錯了


如圖設(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

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

相關(guān)閱讀更多精彩內(nèi)容

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