一、先創(chuàng)建一個(gè)靜態(tài)庫(kù)工程,選擇framework

1
二、把項(xiàng)目中使用的三方框架 用cocoapods 生成
三、把需要打包的項(xiàng)目文件直接拖進(jìn)來(lái)

2
四、創(chuàng)建一個(gè)單利或者是你自己寫好的方法也是可以的

3
五、
- 框1:這里是你拖進(jìn)來(lái)將要打包成framework的項(xiàng)目文件
- 框2:這個(gè)按著原本項(xiàng)目的配置即可
- 框3:原本工程使用的庫(kù)文件會(huì)自動(dòng)添加到這里,但不會(huì)包含三方框架
-
框4:framework支持真機(jī)就選擇真機(jī),支持模擬器就選擇模擬器兩個(gè)都支持合并即可
4
六、
- 框1 : 這個(gè)是你編譯成framework的文件,如果有外部文件或者是單獨(dú)的框架是和framework一使用的,這里需要把對(duì)應(yīng)的.m文件刪除
- 框2 : 同上 如果有單獨(dú)的系統(tǒng)庫(kù) 也是一樣的處理方式,如果framework需要使用的沒(méi)有添加進(jìn)來(lái)可以加進(jìn)來(lái)
- 框3 : 這里的文件都是會(huì)在framework的Headers里面顯示出來(lái)的文件,頭文件必須引用必須都是能看得到的狀況下引用,沒(méi)有的添加到系統(tǒng)的PCH文件里面
-
框4 : 參考注意事項(xiàng)第1點(diǎn),把封裝好的接口文件拖入到框3即可,保證framework和項(xiàng)目文件的不重復(fù)
5
七、如果你原來(lái)的工程中包含有PCH文件,這時(shí)你需要在靜態(tài)庫(kù)工程中重新修改下它的路徑,再添加一次即可
八、配置
-
1、將Mach-O Type設(shè)為Static Library,framework可以是動(dòng)態(tài)庫(kù)也可以是靜態(tài)庫(kù),對(duì)于系統(tǒng)的framework是動(dòng)態(tài)庫(kù),而用戶制作的framework只能是靜態(tài)庫(kù)6
-
2、將Link With Standard Libraries關(guān)閉,我想可能是為了避免重復(fù)鏈接7
-
3、選擇工程文件>target第一項(xiàng)>Build Setting>搜索linking,然后幾個(gè)需要設(shè)置的選項(xiàng)都顯現(xiàn)出來(lái),首先是Dead Code Stripping設(shè)置為NO,網(wǎng)上對(duì)此項(xiàng)的解釋如下,大致意思是如果開(kāi)啟此項(xiàng)就會(huì)對(duì)代碼中的”dead”、”unreachable”的代碼過(guò)濾,不過(guò)這個(gè)開(kāi)關(guān)是否關(guān)閉,似乎沒(méi)有多大影響,不過(guò)為了完整還原framework中的代碼,將此項(xiàng)關(guān)閉也未曾不可8
九、導(dǎo)出framework
一、添加run script方法實(shí)現(xiàn)打包framework:
1、在targets里創(chuàng)建一個(gè)新的target
2、在build phases里創(chuàng)建新的run script
3、在run script里添加如下代碼:
#!/bin/sh
#要build的target名
TARGET_NAME=${PROJECT_NAME}
if [[ $1 ]]
then
TARGET_NAME=$1
fi
UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/${PROJECT_NAME}/"
#創(chuàng)建輸出目錄,并刪除之前的framework文件
mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"
rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"
#分別編譯模擬器和真機(jī)的Framework
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
#拷貝framework到univer目錄
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"
lipo "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" -remove arm64 -output "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}"
#合并framework,輸出最終的framework到build目錄
lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"
#刪除編譯之后生成的無(wú)關(guān)的配置文件
dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"
for file in ls $dir_path
do
if [[ ${file} =~ ".xcconfig" ]]
then
rm -f "${dir_path}/${file}"
fi
done
#判斷build文件夾是否存在,存在則刪除
if [ -d "${SRCROOT}/build" ]
then
rm -rf "${SRCROOT}/build"
fi
rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"
#打開(kāi)合并后的文件夾
open "${UNIVERSAL_OUTPUT_FOLDER}"
4、生成方法:直接選擇該target運(yùn)行即可
5、生成framework后,直接引導(dǎo)想要使用的項(xiàng)目中即可
二、真機(jī)版本和模擬器版本framework 合并:
-
release模式下運(yùn)行(真機(jī)&模擬器)9
-
1、查看架構(gòu)信息
終端 命令行 lipo -info 空格 framework 地址
打開(kāi)終端使用命令行 lipo -info 查看framework架構(gòu)信息
10
真機(jī)版本
模擬器版本 -
2、合并真機(jī)模擬器版本
lipo -create 真機(jī)路徑 模擬器路徑 -output 真機(jī)路徑
11 -
3、查看合成的testNewFramework架構(gòu)信息(如下圖正確)12
十、Bundle 的制作
1、創(chuàng)建一個(gè).bundle的文件 為 image.bundle
2、打開(kāi)這個(gè)文件夾,放入圖片
3、Framework里引用圖片代碼如下:
4、引用Framework的時(shí)候,將 image.bundle 和Framework放到同一文件下,拖入到項(xiàng)目中即可
-
1、創(chuàng)建13
-
2、改為 iOS 樣式,默認(rèn)是 macOS 樣式14
-
3、bundle 配置信息1516
- 4、直接將圖片拖進(jìn)項(xiàng)目、運(yùn)行
- 5、在framework中修改獲取圖片路徑:
1、framework中定義宏:
//bundle圖片
#define csBundle_Name @"imageceshi.bundle"
#define csBundle_Path [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:csBundle_Name]
#define csBundle [NSBundle bundleWithPath:csBundle_Path]
2、圖片調(diào)用修改為:
xxx.image = [UIImage imageNamed:@"" inBundle:csBundle compatibleWithTraitCollection:nil];
問(wèn)題:
1、解決分類(使用)
iOS 程序引入framework 類別報(bào)錯(cuò)unrecognized selector sent to class

解決分類問(wèn)題
2、bundle帶來(lái)的打包失敗:

bundle帶來(lái)的打包失敗問(wèn)題

解決方法
3、framework推薦如下設(shè)置:
Mach-O Type > Static Library;( 靜態(tài)庫(kù),如果需要提審 Appstore 的話不允許使用動(dòng)態(tài)庫(kù)的)
Dead Code Stripping > NO;(是否消除無(wú)效代碼)
Link With Standard Libraries 默認(rèn)是YES,如果沒(méi)有特殊要求的話,默認(rèn)就可以。(設(shè)為 NO 要配置Other Linker Flags)
Enable Bitcode > NO;(支持舊庫(kù))














