iOS 項(xiàng)目打包framework

一、先創(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)信息
    打開(kāi)終端使用命令行 lipo -info 查看framework架構(gòu)信息

    終端 命令行 lipo -info 空格 framework 地址
    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 配置信息
    15
    16
  • 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ù))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,205評(píng)論 3 119
  • 這段時(shí)間,雖泡在醫(yī)院里,但感覺(jué)自己的收獲還是蠻大的。 與丈母娘的近距離相處,覺(jué)悟了老人——特別是老年女人更需要什么...
    安郎若素閱讀 1,424評(píng)論 0 2
  • 1、概念簡(jiǎn)介: 線程安全:就是當(dāng)多線程訪問(wèn)時(shí),采用了加鎖的機(jī)制;即當(dāng)一個(gè)線程訪問(wèn)該類的某個(gè)數(shù)據(jù)時(shí),會(huì)對(duì)這個(gè)數(shù)據(jù)進(jìn)行...
    青見(jiàn)青閱讀 8,175評(píng)論 0 4
  • 上蒼一切的安排都是 有深意的 二十多年后驀然回首 才驚覺(jué) 老天爺早已幫我做好了 最好的安排
    陳糊涂閱讀 183評(píng)論 1 1
  • 不必說(shuō) 綠的太濃 紅的太艷 不必說(shuō) 陽(yáng)光太熱 月光太寒 不必說(shuō) 女兒太柔 男兒太堅(jiān) 不必說(shuō)滄海 也不必說(shuō)桑田 不必...
    三生詩(shī)風(fēng)月情閱讀 242評(píng)論 0 0

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